{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Chapter 10 – Introduction to Artificial Neural Networks with Keras**\n",
    "\n",
    "_This notebook contains all the sample code and solutions to the exercises in chapter 10._"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Setup"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First, let's import a few common modules, ensure MatplotLib plots figures inline and prepare a function to save the figures. We also check that Python 3.5 or later is installed (although Python 2.x may work, it is deprecated so we strongly recommend you use Python 3 instead), as well as Scikit-Learn ≥0.20 and TensorFlow ≥2.0-preview."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Python ≥3.5 is required\n",
    "import sys\n",
    "assert sys.version_info >= (3, 5)\n",
    "\n",
    "# Scikit-Learn ≥0.20 is required\n",
    "import sklearn\n",
    "assert sklearn.__version__ >= \"0.20\"\n",
    "\n",
    "# TensorFlow ≥2.0-preview is required\n",
    "import tensorflow as tf\n",
    "assert tf.__version__ >= \"2.0\"\n",
    "\n",
    "# Common imports\n",
    "import numpy as np\n",
    "import os\n",
    "\n",
    "# to make this notebook's output stable across runs\n",
    "np.random.seed(42)\n",
    "\n",
    "# To plot pretty figures\n",
    "%matplotlib inline\n",
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "mpl.rc('axes', labelsize=14)\n",
    "mpl.rc('xtick', labelsize=12)\n",
    "mpl.rc('ytick', labelsize=12)\n",
    "\n",
    "# Where to save the figures\n",
    "PROJECT_ROOT_DIR = \".\"\n",
    "CHAPTER_ID = \"ann\"\n",
    "IMAGES_PATH = os.path.join(PROJECT_ROOT_DIR, \"images\", CHAPTER_ID)\n",
    "os.makedirs(IMAGES_PATH, exist_ok=True)\n",
    "\n",
    "def save_fig(fig_id, tight_layout=True, fig_extension=\"png\", resolution=300):\n",
    "    path = os.path.join(IMAGES_PATH, fig_id + \".\" + fig_extension)\n",
    "    print(\"Saving figure\", fig_id)\n",
    "    if tight_layout:\n",
    "        plt.tight_layout()\n",
    "    plt.savefig(path, format=fig_extension, dpi=resolution)\n",
    "\n",
    "# Ignore useless warnings (see SciPy issue #5998)\n",
    "import warnings\n",
    "warnings.filterwarnings(action=\"ignore\", message=\"^internal gelsd\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Perceptrons"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Note**: we set `max_iter` and `tol` explicitly to avoid warnings about the fact that their default value will change in future versions of Scikit-Learn."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from sklearn.datasets import load_iris\n",
    "from sklearn.linear_model import Perceptron\n",
    "\n",
    "iris = load_iris()\n",
    "X = iris.data[:, (2, 3)]  # petal length, petal width\n",
    "y = (iris.target == 0).astype(np.int)\n",
    "\n",
    "per_clf = Perceptron(max_iter=1000, tol=1e-3, random_state=42)\n",
    "per_clf.fit(X, y)\n",
    "\n",
    "y_pred = per_clf.predict([[2, 0.5]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1])"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure perceptron_iris_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "a = -per_clf.coef_[0][0] / per_clf.coef_[0][1]\n",
    "b = -per_clf.intercept_ / per_clf.coef_[0][1]\n",
    "\n",
    "axes = [0, 5, 0, 2]\n",
    "\n",
    "x0, x1 = np.meshgrid(\n",
    "        np.linspace(axes[0], axes[1], 500).reshape(-1, 1),\n",
    "        np.linspace(axes[2], axes[3], 200).reshape(-1, 1),\n",
    "    )\n",
    "X_new = np.c_[x0.ravel(), x1.ravel()]\n",
    "y_predict = per_clf.predict(X_new)\n",
    "zz = y_predict.reshape(x0.shape)\n",
    "\n",
    "plt.figure(figsize=(10, 4))\n",
    "plt.plot(X[y==0, 0], X[y==0, 1], \"bs\", label=\"Not Iris-Setosa\")\n",
    "plt.plot(X[y==1, 0], X[y==1, 1], \"yo\", label=\"Iris-Setosa\")\n",
    "\n",
    "plt.plot([axes[0], axes[1]], [a * axes[0] + b, a * axes[1] + b], \"k-\", linewidth=3)\n",
    "from matplotlib.colors import ListedColormap\n",
    "custom_cmap = ListedColormap(['#9898ff', '#fafab0'])\n",
    "\n",
    "plt.contourf(x0, x1, zz, cmap=custom_cmap)\n",
    "plt.xlabel(\"Petal length\", fontsize=14)\n",
    "plt.ylabel(\"Petal width\", fontsize=14)\n",
    "plt.legend(loc=\"lower right\", fontsize=14)\n",
    "plt.axis(axes)\n",
    "\n",
    "save_fig(\"perceptron_iris_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Activation functions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def sigmoid(z):\n",
    "    return 1 / (1 + np.exp(-z))\n",
    "\n",
    "def relu(z):\n",
    "    return np.maximum(0, z)\n",
    "\n",
    "def derivative(f, z, eps=0.000001):\n",
    "    return (f(z + eps) - f(z - eps))/(2 * eps)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure activation_functions_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 792x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "z = np.linspace(-5, 5, 200)\n",
    "\n",
    "plt.figure(figsize=(11,4))\n",
    "\n",
    "plt.subplot(121)\n",
    "plt.plot(z, np.sign(z), \"r-\", linewidth=1, label=\"Step\")\n",
    "plt.plot(z, sigmoid(z), \"g--\", linewidth=2, label=\"Sigmoid\")\n",
    "plt.plot(z, np.tanh(z), \"b-\", linewidth=2, label=\"Tanh\")\n",
    "plt.plot(z, relu(z), \"m-.\", linewidth=2, label=\"ReLU\")\n",
    "plt.grid(True)\n",
    "plt.legend(loc=\"center right\", fontsize=14)\n",
    "plt.title(\"Activation functions\", fontsize=14)\n",
    "plt.axis([-5, 5, -1.2, 1.2])\n",
    "\n",
    "plt.subplot(122)\n",
    "plt.plot(z, derivative(np.sign, z), \"r-\", linewidth=1, label=\"Step\")\n",
    "plt.plot(0, 0, \"ro\", markersize=5)\n",
    "plt.plot(0, 0, \"rx\", markersize=10)\n",
    "plt.plot(z, derivative(sigmoid, z), \"g--\", linewidth=2, label=\"Sigmoid\")\n",
    "plt.plot(z, derivative(np.tanh, z), \"b-\", linewidth=2, label=\"Tanh\")\n",
    "plt.plot(z, derivative(relu, z), \"m-.\", linewidth=2, label=\"ReLU\")\n",
    "plt.grid(True)\n",
    "#plt.legend(loc=\"center right\", fontsize=14)\n",
    "plt.title(\"Derivatives\", fontsize=14)\n",
    "plt.axis([-5, 5, -0.2, 1.2])\n",
    "\n",
    "save_fig(\"activation_functions_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def heaviside(z):\n",
    "    return (z >= 0).astype(z.dtype)\n",
    "\n",
    "def mlp_xor(x1, x2, activation=heaviside):\n",
    "    return activation(-activation(x1 + x2 - 1.5) + activation(x1 + x2 - 0.5) - 0.5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmkAAAEMCAYAAACfoCGmAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3Xu8XHV97//XJ9nZOzcCgcSkAZJguATxZ1DAG6KopaLWGi7nVwXBCxov5ecV8+N4RCm1ijnFWhBRKpeKQvtTLpVatbTqKZRjRTheoA0okHBrApJNkp3L3tk7n98faw1OJrP3nlnzXff38/GYR7Jn1qz1mdmzv/Oe76zPWubuiIiIiEixTMm7ABERERHZm0KaiIiISAEppImIiIgUkEKaiIiISAEppImIiIgUkEKaiIiISAEppGXAzNaZ2XkZbOdCM7s3g+1MMbOvmtnTZuZmdmLa25yknmvN7B9y2O7S+PEfm/W229TS8XNgZifGdc+bYJnTzUzH55EJaWxLvZ5cxrbJFKmuTmoxs38ws2szKiko03HS9mRmLwR+BvzE3Y/v8r4XAqe7+/Nbrp8PbHP37YFqXAo8DBzn7j9run42MODuT4fYzgTb/0PgJuBE4CFgk7uPpLnNeLsnAj8C5rv7b5uu35fotfxM2jW01LOUNr+HPHTzHJhZP7A/sNHHGQDM7HTgW+5uYSuVvGhs62j7Gts6UKS6OqklDnG/dfd3ZFZYIH15F1BA7wG+DJxtZke6+3/2ukJ3f6r3sjrazhAwlMGmDgX+y93vzGBbk3L3zXnXkLdunoP4TWdDiuVIMWlsm5zGtg4Uqa4i1ZIKd9clvgAzgGeAFwBXAX/RZplFwDeBp4HtwM+BVwPvALzl8o74PuuA8+L/3wDc2LLOKcCjwEfin08GbgcGgU3AD4Ajm5Zv3c6P4+svBO5tWe8F8bqHgV8Bb266fWl8/9OA2+LH8x/ASRM8R9e2bHtdfP2PgS+1WfYfmn7+MdGbxGeB3wJPAn8BTGlapj++fX1c80PAB5tqbb5cO852BoAvAhuBncBPgFc03X5ifP/XAv8eP+6fAS/q8vXS0fMHPA/4LrA1fsw3AAubbj8O+Kf4OdkC3AG8rOn2Tl4zrc/BK+PHPQRsjh/n81se/7ym5c+On/PtwD8AfwJ4yzbfBNwdP6cPA38O9Of9d6tLR69VjW0a27p9zXyqqdYNwNcnePyzgK8TjTcbgf9ONI5c27TMunid1xKNhY8CfwzsB/xtfN9fA3/QUscr48eyM173X9I07rSpZWZ8XaOWT7TWUqZL7gUU6QKcBfwi/v+J8R/atJYX4q+Bf4tfOMuAU4kGshnxH+VaYGF8mdH04mwMZG+MX2z7Na331cAo8Rs30cByGnAY0aD6/wG/abwwid7UHXhdvJ394+svZM+B7CNEb/pnAIcDFwFjwNHx7Uvj9awlegM+DPgbokF69jjP0b7An8Z/YAuJpueh84Fsc1zH4cD/HT/utzYtcwPwWPz4nxs/N2cDU+Pn2olCz0Jg33G281fAf8XP9ZHAX8d/sL/X9Lt14Kfx+pcTvVn8J/EuAPFyDlw4wetl0ucP+D2iQfvzcS0vAG6Ntz0lXuY1RK+9I+NavkT0Jjavi9fMs88B0Qz5INHrcVm8zjOI3wxpCWnAS4DdwP+Ify/vjR+DN23vdUSvpXfG63w1cD9t3ux1Kd4FjW0a27ob206Ln983AouBY4FzJ3j8XyEKdCcBRxGFrs3sHdI2AR+Ifx+XEL1e/jF+Hg4l+gDxJDA9vs+BwLZ4/UcCf0gUGC+ZoJYvA48TvYaeD3wrfizXjvd4i3zJvYAiXYD/xe8GHItfVKc13f4eok8A88a5/4U0DSRN169rWm9f/CI8p+n2rwE/mKCuWUQD0Cvin5fGf2THTrT9+IX6qZZlfgx8o2U97226/cD4uldMUM95xJ8yW9bbyUD2v1uWuQ34Wvz/w+JtnzzOdk+kZQaodTvxczUCnN10+1TgQeAzLet5XdMyx8fXHdR03VqaBqY29Uz6/BEN2v/Scr+58TIvHme9RjQQv63T10zLc7B/vP5XdfI8AtcDt7Us8zX2DGn/ClzQssxKojcIa7cdXYpzQWPbXn+b49SjsS26/aNEH8KmjXN7c12z47re0vJ7HWTvkHZD08+z47oubbpuj98/0Wz9b9hzRvIdRLN7M8epZRg4s2U7z1DSkKbuzpiZHUr0Yr4e4nenaOr/3U2LvRD4pTft2Nktdx8F/g44M97uANGnlm801bLMzK43swfNbAvRlO0Uok80nT6eOURfX/xby013EH1aa/bLpv8/Ef/7nE631aVftvz8RNO2Xkg0o/OjHta/DJhG0+N29zHgf9Pl43b35e7+pQ62OdF6jgFeaWZDjQvRJ/VGrZjZc+KOsgfMbDPRm+VziH/fnbxmmrn7JqKB6wdm9l0z+6iZHTxB/UcSPT/NWn8+BvgfLY/jeqLBeOEE65acaWx7lsa2391vsrHtW8B04GEzu8rM/lv8+5yorp82rX8b0K4b95dNywwRfR37q6bbN7bUeiRR+N3dtMwdRF8dHzpOLf00jV/xdn7VZtlSUOPA77yb6FPJI2bPNrQZgJkd7O6PNn4O4BvAnWZ2INFXTf3AzU2330r0SfG98b+jRPtT9CfYlndw3a5nb3D3+PF3G+B3s/fzM63NcrtafvambYV4fhvr6OpxN92W5IPLRM/fFKL90dodpqAxIP0NsIDoK5x1RJ8E/4U9f9+TvWb24O7vNLMvEu0D9EfAn5vZSnf/QZvFO3nepxB9FfStNrdlsvO4JKaxDY1tdPG43f1RMzuCaN+23yf6avLTZvaSOIB1Wlerds/RRLXaBOttd33lutE1kwaYWR/wdqKdHY9uuqwgSv7vjBe9B3jBBMeXGiEaDCfk7v9ONEX9VqJPnbfEaR8zO4Do08Nn3f2fPerA2oc9A3WjJXzcbbn7FqJPUK9ouekVRINiaE8R7X/VbEWX67iH6DX56nFun/RxE02Nj9D0uM1sKvAy0nnck7mHaB+N9e7+m5bL1niZVwCXuft33f0+opm0PZ7LiV4z43H3X7j75939RKKvY94+zqL/Aby05brWn+8Blrd5DL+JZ1CkgDS2BVHLsc3dd8Zj0keI9hU8imhGtl1du4AXN9U1k2h/sF79B/AyM2vOKq8geh4enKCWZ8cvM5sVqJZcKKRF3gjMA/7a3e9tvhDtAPmu+EVyPdE+F7eY2QlmdoiZ/ZGZNf7w1gFLzOxFZjZvgulh+N3XDW9kz6+tBol2NH+PmR1qZq8i2mmy+Y3wSWAH8DozWxAfJ6ad/wmcZ2ZvNbPDzewi4ASiT0Wh/RB4ffx8HGFmXwAm+optL+7+a6Idib9mZqfFz+8JZnZWvMh6ok9PbzSz+fGxk1rXsQ24ArjYzN5gZkfGPy8g2qG0Y2a21szO7eY+bVxOtEPy35nZS8zsuWb2+2Z2pZntEy/zAPA2M3uemR1H9Jprd2ym8V4zrXUfYmYXm9nLzWxJ/Pp8AeMP5JcCv29m/93MDjOz9wCntCxzEXCGmV1kZs83s+UWHfB2TYfPg+RDY1vvaje2mdk7zOzdZvZ/mdkhRGF+F1FzSWtdQ8DVwOfN7LVm9jyifRGn0Nns2kS+TPTV9pfN7EgzeyNwMdE+gnsdmy+u5aq4lpPM7Ki4tkk/YBSVQlrkHOBH3v5Aid8ClgC/H/+RvIpomv5W4D6ir4AaL8QbiTpV/oXo09dbJ9jmN4AjiDpgbmtcGX/3/sdEb6r3Er3JX0D0FVhjmVGi1u13E32i/PtxtnEp0WC2Jl7XKUQ7C/98grqSurrp8m9EO5SP+3XcBM4mesO4lGjn1muJQg7u/jjwaaKdSTcSdUG28/8SDYjXEB1G4AVEO+z+V5e1HEH0BpeYuz9B9OlzN/B9otfM5US/z8bv9F1EO7feTfTGeTXRm2Krtq+ZNrYTdZh9iygA/g3RG+fnx6nxJ0R/A+8nml05lWhH7eZlfkD0pvtqon1PfgqcDzwyQR2SP41tvavj2PYM0WvndqLn9zTgVHd/eJzlz4uX/Q7Rfne/JDr0x84u69pD/Ly8nmifvp8T/Q5uIDqsxnjOi2u4Of73XqLGp1LSGQdEREQkmHimdT3wP909jdnN2lDjgIiIiCRm0SnHjiSaYd+HaMZvH6JuX+lBsK87zexcM/uZmQ3bBCcyNbO3m9ndZrbFzB4zszXxzq0iIrnRGCbSk48C/4doH74FwCvd/bF8Syq/kPukPQF8hug744nMBD5M9H34S4hafNsdnkBEJEsaw0QScPf/4+7Huvs+7j7X3V/t7nfnXVcVBPv05+43AZjZscBBEyx3RdOPj5vZNxm/LVlEJBMaw0SkaIowRf9Kok6itsxsFbAKYPr0gWMOOjitg0V3z70Ps2IdIipUTWM+hbHRqdjY7skXnsDUvimMjfa2jpBUz8SKVg/A+kfX/dbd5+ddxwTGHcNax6+DCzR+QXZj2GiHX9pM8anstrGUq5ncmEf19rkxavk013mbP8M+m8JouxuCbDDZcWCnTTF27e78OUr76eybYoxmMIZZh02XvY5fuYY0M3sn0Ylb3z3eMu5+JXAlwGGHL/Zv/3NxulGfWPsRFi0v1mGiwtU0xnWDL+G2q1/KohvH67qe3KkfPo6b1twVoJ4wVM/EilYPwHouW593DeOZbAxrHr8OP3yx3/ovxfpQt27teSxdfnEm2/r2lhdNusyyR1fy4MG3ZFDN5G7bsJwzth/N9TPTOKpHZ9Y9tud7+0dmL+GSoXT/HAYe6e7kDx889EAu/c3jXW9nn/XpvJefc8KBXHX74+z74PDkC/eof+3ku9yt58s9/cJyO06ama0kOijd63s5X5yk56y5d3LSu37C/auX5F2KSOFoDOvO6XPuybuErpy0cC1zpvV0mK+eLT0o+zOuDS9udxzt8LYuSfcMTpuXDbB52UTHXO7dyPJx94oIJpeQZmYnA38NvMndS3vi0zo4a+6d3Lzyi9y/egk7nn9g3uWIFILGsGTKFtQgCmt5WnrQU5mHtaoENaD0QS3kITj6zGw60ekXpprZ9HZt6Wb2GqKjn5/m7j8NtX1J180rv8imP9mmoCaVpTEsGwpqySioJVfmoBZyJu2TROdcOx94W/z/T5rZYjMbMrPF8XIXEJ0K4x/j64fM7HsB65CUXLfiGjb9yTaeOO2QvEsRSYPGsIwoqCUz0J/tPo0Kap1LK6gFC2nufqG7W8vlQnd/xN1nu/sj8XKvdve++LrG5fWh6pB0XbfiGk56108U1KRyNIZl6/Q595QurBUhqGlGLbksglrosKYTrEvXGg0FCmoi0isFte7lEdSyCGtbl1gmDQVpCxnUFNIkEXV+ikgoZQxqeYc1dX4mV6bOT4U0SUydnyISStmCGuQ/q6bOz96UIagppEnP1PkpIiHMnbo97xK6lndQA+2n1ossvv7shUKaBKHOTxEJQTNqySioJVfkoKaQJsGo81NEQlBQS0ZBLbmiBjWFNAlKnZ8iEoIO0ZFM1kFtd/9udX6mSCFNglPnp4iEUsaglndYU+dncll0fnZDIU1S0ej8HF7Yr4YCEelJ2YIa5D+rps7P3hQlqCmkSaqW7fekOj9FpGcKaskoqCVXhKCmkCapU+eniISgoJaMglpyeQc1hTTJhDo/RSQEBbVkFNSSyzOoKaRJZtT5KSIhqPMzGZ3zM7m8gppCmmRKnZ8iEkoZg1reYU2dn8nl0fnZl+nWKmT36Bj9fX/F7tExpvRNzbucUjlr7p2ctfJOTuHDLP7HUWbc+3jeJVXeD8+8ipGZk59y5/uDwHsmX1//9pm85pvn9F6Y5GZsdIxpUy9lbHSMqSUew06fcw/f3vKivMvoykkL13LbhuW5bb8R1NY9Nj+zbQ4vHmHgkf7E939w96cZY+uky31gHXDw5OvrG9uHFU9cmKiWzcsG2PfB4UT37ZZm0hLaMbiFKfYQOwa35F1Kaemcn9npJKDluT7J3tDgEGYPMTQ4lHcpPSvbjBrU9+vPpDoJaN0Yndrb+rKaUVNIS2D36BgjQ9swc0aGtrF7dCzvkkpLnZ8i2RsbHWP71u2YOdu3bmesAmOYgloyZQpqRZNFUFNIS2DH4Bbw+AdHs2k9UuenSLaGBof2GMOqMJsGCmpJKagll3ZQU0jrUmMWrZlm03qnzk+RbDRm0ZpVZTYN1PmZVFU7P7OQZlBTSOvSHrNoDZpNC0KdnyLp22MWraFCs2kNZQxqeYe1Knd+pi2tzk+FtC60m0Vr0GxaGI1zft6/eokaCkQCazeL1lCl2bSGsgU1yH9Wrcrn/MxC6KAWNKSZ2blm9jMzGzazaydZ9iNmtsHMNpvZ1WaW/0myJtF2Fq1Bs2lBqfNTslb18QvGmUVrqOBsGiioJaWgllzIoBZ6Ju0J4DPA1RMtZGavA84HXgssBZ4L/GngWoKaaBatQbNpYanzUzJW2fELJp5Fa6jibBooqCWloJZcqKAWNKS5+03ufgvw9CSLvh24yt3vc/dB4M+Ad4SsJbQJZ9EaNJsWnDo/JStVHr9gklm0horOpoGCWlIKasmFCGp5nXHgKODvm37+BbDAzA5w9z0GSDNbBawCmD9/Hk+s/VR2VT5rM9OnXYR1cMaJ4S0jbH76fcCc1KtqZ9fOBTyxdnUu224nRD2vBY4+eRZbjn0F0wZ7O8rz3IWzOHX1cT2tI6Ss6vn+YPh1ZvU8fv9DmWymG4nHr3VrL8iuyj1spr/vzzoaw7Zt3sXg0x8gjzFseOdC1q09P7X1Hxv/Ozg2s6PlB0b2Y9mjK1OrpxPLgC27pgOw/+6ZnLH96OyL2B+GR9rHhQVTB/jY7MDNXs+L/pky8rt5pHMfCLsJgHe+9qB4O5N9eknu7qt6u39eIW02sLnp58b/96HlU6y7XwlcCXDY4Yt90fI1mRTYbNtTg4xs3dXRsma72PeAzzFr/tyUq2rvibWryeM5Gk+oehYB1w2+nJv+14s5Ys36xOs5dfVx3LTmrp7rCSWzejo41VO3ivQ8ZizR+HX44Yt96fKLMymw1eanNrN9S+dj2NwDPse+8/dNuaq9rVt7Plk8R0uho1NJLXt0JQ8efEvq9XTsobdw/cyf57Ptme1PI/Wx2Uu4ZCj5mDyZXk4lNZlLf/O7UxLusz69oNaLvLo7h9jzY1rj/2HP+xBAJ/uitdK+aelQ56cURGnGL+hsX7RWVd03rVkZv/6cM21nrtuvcudn2idnTyqvkHYfsKLp5xXAxtavCoqgo33RWmnftFSp81NyVprxCzrcF61VhfdNa1bGoKb91NJTxKAW+hAcfWY2HZgKTDWz6WbW7ivVrwPnmNnzzGwu8Eng2pC1hJBkFq1Bs2npUuenhFa18QuSzaI11GE2DRTUksrjwLdZKFpQCz2T9klgB1F7+tvi/3/SzBab2ZCZLQZw9+8Da4AfAevjy6cD19KzRLNoDZpNS506PyWwSo1fkHAWraEms2mgoJaUglr6gjYOuPuFwIXj3Dy7ZdkvAF8Iuf2QeplFaxgZ2saMuXOY0jc1UFXS6qy5d8K74DZeyqIbH867HCmxKo1f0NssWsP2rduZPXc2U2swhjWCWicNBUVx0sK13LZhea41DPSP5rr9tDSCWt4NBTot1Dh6mkVr0GxaJnTOT5G99TSL1lCj2bSGss2q1fWcn1nJe1ZNIa2NELNoDdo3LRvq/BT5nRCzaA112TetWdmCGuT/9WcenZ9ZyTOoKaS1EWQWrUGzaZlS56dIoFm0hhrOpoGCWlIKamEppLUxNhy23Tf0+mRi6vzcW//2zo6wntf6JKyRnWHHnNDrK4u5U8PMRmapqkFtypTZky/Uhans0/V98ghqeZ1xoNDmHLSgo+WKdnR/+Z3rVlzDdYtfroaC2Gu+eU5HyxXtjAySzPyD9z4yfDtZHeG/zE6fc0+pmgmgGA0FSw96qu0ZCpI6ePEnJ11m4JF+PnjogXucSSC0rUss02YCzaRJZTUaCjSjJiK9OH3OPaX7+rOqM2oTGV48wu7+3alvZ+sSy2xWTSFNKk2dnyISShmDWt5hLY991Kp0hgKFNKm85s5PnzEt73JEpMTKFtQg/1k1nfMzOYU0qY2bV36R0efsVueniPREQS0ZBbXuKaRJrRwy42l1fopIzxTUklFQ645CmtSOzvkpIiEoqCWjoNY5hTSpJXV+ikgI6vxMJo+glkVYC935qZAmtaXOTxEJpYxBLe+wps7PySmkSa3pnJ8iEkrZghrkP6umzs+JKaSJoHN+ikgYCmrJVDWo9UohTSSmc35KmkY13NaGgloyCmp706gh0kSdn5Kmsp0DUpJTUEtGQW1PCmkiLdT5KWlSUKsPdX4mU9XOzyQU0kTaUOenpElBrV7KGNTyDmtV7vzshkKayDjU+SlpUlCrl7IFNch/Vq3KnZ+dUkgTmYQ6PyUtCmr1oqCWTJ2DWtCQZmb7m9nNZrbNzNab2RnjLDdgZl8xs41mtsnMbjUzvQNKYanzs/ryGr++veVFCms1oqCWTF2DWuiZtMuBEWABcCZwhZkd1Wa5DwEvA14ALAKeAS4LXItIUOr8rLxcxy8FtfpQUEumjkEtWEgzs1nAacAF7j7k7ncA3wHOarP4IcAP3H2ju+8E/hZoNxiKFIo6P6upKOOXglp9qPMzmbp1fpq7h1mR2QuBO919RtN15wGvcvc3tSx7LPBXwH8j+hT6NeBJd/9wm/WuAlYBzJ8/75i/+cangtQbwq6dC5g2fWPeZeyhaDVVtZ6nx2bxzNZZDGzo7Y937sJZDG7Y1nM9oRStHoBVHzr7bnc/Ns1tZDF+zZs/75jLvv65juqZO3V7wkfSneGdCxmYviGTbXWirvUMjs3saLmBkf0Y7n8m5Wo6s2XXdAD23z2TTVOyeb02Gx7pa3v9gqkDbBwbTmWbU0a6n9c694w/7mn8av8ok5kNbG65bjOwT5tlHwAeAR4HxoBfAee2W6m7XwlcCXDY4Yt90fI1oert2RNrV1OkeqB4NVW1nkXxv6fc8mEW/+MoM+59PNF6Tl19HDetuavnekIpWj0ZSn38eu7hS/3Bg2/puKAsZlnWrT2fpcsvTn07naprPUvpbBZ12aMr6eY1lLbbNiznjO1Hc/3Mn2e/8TjXrnts/h5Xf2z2Ei4ZWp/aZgce6U9t3e2E3CdtCJjTct0cYGubZa8ApgMHALOAm4DvBaxFJBPq/KyMwo1f+uqzXsr21SfU9+vPLIUMaQ8AfWZ2WNN1K4D72iy7ArjW3Te5+zDRTrcvNrN5AesRyYQ6PyuhkOOXOj/rpYxBbc60nXmXUOmgFiykufs2ok+UF5nZLDM7HngzcF2bxe8Czjazfc1sGvAB4Al3/22oekSypM7Pciv6+KWgVh9lDGqaUUtP6ENwfACYATwJ3AC8393vM7MTzGyoabnzgJ3Ar4GngDcApwSuRSRT6vwsvUKPXwpq9aHOz2Sq2PkZsnEAd98ErGxz/e1EO+Y2fn6a6DhEIpVy1tw74V1w07IXc8Sa9HZelfDKMH59e8uLSvfmLcmdPueeUoXzRlC7bcPy3GoY6B/NfJvDi0dSayjQaaFEAtM5PyVNZXrTlt6VMZTnPatWpXN+KqSJpESdn5IWBbV6UVBLpgpBTSFNJEXq/JS0qPOzXhTUkil7UFNIE0mZOj8lTQpq9ZHVmShCUlDrjUKaSAbU+SlpUlCrD3V+JlPWzk+FNJGMNILa/auX5F2KVJCCWr2UMajlHdayDmohKKSJZEidn5ImBbV6KVtQg/xn1fLo/OyFQppIDhqdnz5jWt6lSMUoqNWLgloyZQlqCmkiObluxTWMPme39lOT4NT5WS8KasmUIagppInk6JAZT6uhQFKjoFYfCmrJFD2olSqkDY/pqyGpHnV+SpoU1OpDnZ/JFDmolSqkTdm1m1Nu+TDXDb4871JEglLnp6RJQa1eyhjU8g5rRQ1qpQppAEesWc9tV79UQU0qR52fkiYFtXopW1CD/GfVitj5WbqQBrDoxoe57eqXctYv3pl3KSLB6ZyfkhYFtXpRUEumSEGtlCENoqC2/+WzFNSkknTOT0mLOj/rRUEtmaIEtdKGNIAZ9z7O/pfP4pRbPpx3KSLB6ZyfkiYFtfpQUEumCEGt1CENoqB2xJr1CmpSSer8lDQNjs3MuwTJiDo/k8k7qJU+pDU0gpoaCqRq1PkpadKMWr2UMajlHdbyDGqVCWmgzk+pLnV+SpoU1OqlbEEN8p9Vy6vzs1IhDdT5KdWmzk9Ji4JavSioJZN1UKtcSAN1fkq1qfNT0qLOz3pRUEsmy6AWNKSZ2f5mdrOZbTOz9WZ2xgTLvsjM/tXMhsxso5l9KGQt6vyUKlPnZ3hFGr/ypqBWHwpqyWQV1ELPpF0OjAALgDOBK8zsqNaFzGwe8H3gq8ABwKHAPwWuRZ2fUmnq/AyuUONX3hTU6kOdn8lkEdSChTQzmwWcBlzg7kPufgfwHeCsNot/FPiBu3/T3Yfdfau7/2eoWlqp81OqSp2fYWQxfo15+fYuUVCrlzIGtbzDWtpBLeSocTgw5u4PNF33C2CvT6LAS4FNZnanmT1pZrea2eKAtexFnZ9SVer8DCKT8eu2DcsDlJotBbV6KVtQg/xn1dLs/DR3D7MisxOAb7n7wqbr3gOc6e4ntiz7APAc4CTgV8Aa4Bh3P77NelcBqwDmzZt3zGcv+EJPde6aOwBzRjlkxtM9rQdg184FTJu+sef1hFS0mlTPxELX8/COA+h7cgq2Y1ei+89dOIvBDduC1RPCqg+dfbe7H5vmNjIZv+bPO+bPr/rLZ2+bM21n+AfSpYGR/Rjuf6ajZedO3Z5yNTC8cyED0zekvp1O1bmeTg903M1rKG1bdk1n/90z2TQl/dfqeIZH+vb4+YOnv7Wn8atv8kU6NgTMabluDrC1zbI7gJvd/S4AM/tT4Ldmtq+7b25e0N2vBK4EWLr4EL9pzV09F7rj+Qey6U+2cd2Ka3pazxNrV7No+Zqe6wmpaDWpnomFrmcRcNYv3on981wW3fhw1/c/dfVxhPgbK6HUx68lhz3Xr5/58z1WlPcMwLJHV/LgwbciqNxAAAAb9UlEQVR0dZ80Z1rWrT2fpcsvTm393apzPUvpbBY1yWsoVQ+9hda/s0zNhHWPzQ+2upBfdz4A9JnZYU3XrQDua7PsL4HmKbzG/y1gPeNS56dUmTo/E8ll/NLXn1JkZfzqswgz1CG/+gwW0tx9G3ATcJGZzTKz44E3A9e1Wfwa4BQzO9rMpgEXAHe4e2Zzpur8lCpT52d38hy/FNSkyNT5mUyooBa63egDwAzgSeAG4P3ufp+ZnWBmQ42F3P2HwCeA78bLHgqMe0yiNKnzU6pKnZ9dy238UlCToitjUMs7rIUIakFDmrtvcveV7j7L3Re7+/Xx9be7++yWZa9w9wPdfa67v8ndHw1ZSzfU+SlVpc7PzuU9fimoSdGVLahBMWbVelG+A/ekROf8lCrTOT/L4bYNy0sX1hTU6kVBLVsKaU10zk+pssY5PxXUiq+MQU1hrT4U1LKjkNZCnZ9SZdetuIZjP3+PGgpKoGxBDTSrVicKatlQSGtDnZ9SZer8LA8FNSmy0+fck8lBjkMqW1BTSJuAOj+lqtT5WR4KalJ0ZZtVK0LnZ6cU0iahzk+pKnV+loeCmhRd2YIalGNWTSGtA+r8lCpT52c5qPNTik5BLTyFtA6p81OqrNH5uWvuQN6lyCTKGNQU1upDQS0shbQuqPNTquy6FdcwZ96QGgpKoGxBDTSrVicKauEopHVJnZ9SZQdM3abOz5JQUJMi0zk/w1BIS+iINet58JnnqKFAKkedn+WhoCZFV8agVqSwppDWg4ENI+r8lEpS52d5KKhJ0ZUtqEFxZtUU0nqkzk+pMnV+loM6P6XoFNSSUUgLQJ2fUmU652d5lDGoKazVh4Ja9xTSAlHnp1SZzvlZHmULaqBZtTpRUOuOQlpA6vyUKtM5P8tDQU2KTJ2fnVNIS4HO+SlVpc7P8ihjUBscm5l3CZKhMga1rMOaQlpKdM5PqSp1fpZHGYOaZtTqpWxBDbKdVVNIS5E6P6XK1PlZDur8lKJTUBufQlrK1PkpVabOz/IoY1BTWKsPBbX2FNIyoM5PqTJ1fnbGd+ddQfmCGmhWrU4U1PYWNKSZ2f5mdrOZbTOz9WZ2xiTL95vZWjN7LGQdRaTOT6myKnR+ZjF+rXtsfu+F9khBTYpMnZ97Cj2TdjkwAiwAzgSuMLOjJlj+48CTgWsoNHV+SlVVoPMzk/FLQS0ZBbV6KWNQSyOsBQtpZjYLOA24wN2H3P0O4DvAWeMsfwjwNuBzoWooC3V+SlWVtfMz6/Fr3WPzcw9rCmpSdGULahB+Vi3kTNrhwJi7P9B03S+A8T6JXgZ8AtgRsIbSUOenVFkJOz9zGb/yDmpbdk0vXVhTUKuXugc1c/cwKzI7AfiWuy9suu49wJnufmLLsqcA73X3k83sROAb7n7QOOtdBawCmDdv3jGfveALQeoNYe7CWQxu2NbTOnzGNEafs5tDZjwdpKZdOxcwbfrGIOsKQfVMrOr1PLzjAPqenILt2JV4Has+dPbd7n5ssKLayGT8mj/vmE9dcVnb7Q/0j4Z4GF3bf/dMNk3ZDsCcaTtzqaHZwMh+DPc/0/Hyc6duT7EaGN65kIHpG1LdRjeKVg9kV1OnBzru9jWUpi27pvPePzqrp/GrL2A9Q8CcluvmAFubr4i/VlgDvKGTlbr7lcCVAEsXH+I3rbmr90oDOXX1cYSoZ8fzD+SRN/Rx88ov9ryuJ9auZtHyNT2vJxTVM7Gq17MIuG7w5dx29UtZdOPDwdabgtTHr8XLnuuXDK0fd9mlBz3VRblhnLH9aK6f+fNnf877ZNLLHl3Jgwff0tV90pxpWbf2fJYuvzi19XeraPVAdjUtpbNZ1CSvoSIL+XXnA0CfmR3WdN0K4L6W5Q4jer5vN7MNwE3A75nZBjNbGrCe0lDnp1RZSTo/cx+/8v7qE7SfmhRbGTs/exUspLn7NqIB6yIzm2VmxwNvBq5rWfRe4GDg6PjybmBj/P9HQ9VTRur8lKoqeudnUcYvBbVkFNTqpU5BLfQhOD4AzCBqS78BeL+732dmJ5jZEIC7j7r7hsYF2ATsjn8eC1xP6ajzU6qqBJ2fhRi/1PmZjIJavdQlqAUNae6+yd1Xuvssd1/s7tfH19/u7rPHuc+Px9vptq7U+SlVVtTOz6KNX0UIamULawpq9VKHoKbTQhWUzvkpVaZzfnYm76AG5ZtV0zk/66XqQU0hrcB0zk+pMp3zszMKaskoqNVHlYOaQlrBqfNTqqwknZ+5U1BLRkGtPqra+amQVhLq/JSqKnrnZ1EoqCWjoFYvaR/gOGsKaSWizk+pqhJ0fhaCOj+TUVCrlyrNqCmklYw6P6XKitr5WTRFCGplC2sKavVSlaCmkFZC6vyUKlPnZ2fyDmpQvlk1dX7WSxWCmkJaSanzU6pMnZ+dUVBLRkGtPsoe1BTSSkydn1JljYYCmZiCWjIKavVR5s5PhbQKUOenVNVZc+/Mu4RSUFBLRkGtXsoY1BTSKqLR+fn02Ky8SxGRHKjzMxkFtXopW1BTSKuQRTc+zJbfzlZDgUiNFSGolS2sKajVS5mCmkJaxUwbHFbnp0jN5R3UoHyzaur8rJeyBDWFtApS56dIAbllujkFtWQU1OqjDEFNIa2i1PkpUjwDj/Rnuj0FtWQU1Oqj6J2fCmkVp85PkWJRUCsHBbV6KWpQU0irAZ3zU6RY8ghqeYe1Mga1wbGZeZcgGSpiUFNIqwmd81OkWLIOapD/rJo6P6XoihbUFNJqROf8FCmWgUf69fVnCajzs16KFNQU0mpGnZ8ixaOgVg4KavVRlKCmkFZD6vwUKR4FtXJQUKuPInR+KqTVmDo/RYol66A2PNKX6fbaUVCTosszqAUNaWa2v5ndbGbbzGy9mZ0xznIfN7N7zWyrmT1sZh8PWYd0Tp2fIpGijF/q/CwHBbV6ySuohZ5JuxwYARYAZwJXmNlRbZYz4GxgLnAycK6ZvSVwLdIhdX6KAAUav+ra+bll1/Rca+iWglq95BHUgoU0M5sFnAZc4O5D7n4H8B3grNZl3X2Nu9/j7qPufj/w98DxoWqR7qnzU+qsiOOXOj/LQZ2f9ZJ1UDN3D7MisxcCd7r7jKbrzgNe5e5vmuB+BtwDfNXdv9Lm9lXAKoB58+Yd89kLvhCk3hDmLpzF4IZteZexh15r8hnTGNnXWLbfk0Hq2bVzAdOmbwyyrhBUz8SKVg/AG173wbvd/dg0t5HN+DX/mAsv/VKi+nb37050v8ksmDrAxrHhva4f6B9NZXuT2X/3TDZN2Q7AnGk7c6mh2cDIfgz3P9Px8nOnbk+xGhjeuZCB6RtS3Ua3ilZTVvV0eqDjt77+PT2NXyH3Gp0NbG65bjOwzyT3u5BoRu+adje6+5XAlQBLFx/iN625q7cqAzp19XEUqR4IV9P9q5dw88ov9ryeJ9auZtHyNT2vJxTVM7Gi1ZOh1Mevxc9d5pf+5vHEBQ4vHkl83/F8bPYSLhla3/a2pQc9FXx7kzlj+9FcP/Pnz/580sK1mdfQbNmjK3nw4Fu6uk+aMy3r1p7P0uUXp7b+JIpWU1b1LI3/TXsWNeQ+aUPAnJbr5gBbx7uDmZ1LtG/HG919749zkht1fkrNFH780lef5aCvPusl7a8/Q4a0B4A+Mzus6boVwH3tFjazdwHnA69198cC1iGBqPNTaqQU45c6P8tBQa1e0gxqwUKau28DbgIuMrNZZnY88GbgutZlzexM4LPASe7+UKgaJDx1fkodlGn8qmvnZ9nCmoJavaQV1EIfguMDwAzgSeAG4P3ufp+ZnWBmQ03LfQY4ALjLzIbiy1473UoxqPNTaqI045c6P8tBnZ/1kkZQCxrS3H2Tu69091nuvtjdr4+vv93dZzctd4i7T3P32U2X94WsRcLSOT+l6so4fimolYOCWn2EDmo6LZR0TOf8FCkeBbVyUFCrj5Dn/FRIk66p81OkWBTUykFBrV5CBDWFNElEnZ8ixaLOz3JQUJNuKKRJYur8FCkWdX6Wg4KadEohTXqizk+RzpjDPuvDnIZvIur8LAcFNemEQpr0TJ2fIp3LIqiB9lMrAx2iQyajkCZBqPNTpHMKaukpW1ADzarJ+BTSJCh1fop0RkEtPQpqUhUKaRKcOj9FOlPloJZ3WFNQkypQSJNUNDo/H95xQN6liBRaVYMa5D+rps5PKTuFNEnNohsfpu/JKer8FJnEPutdnZ8pUlCTslJIk1TZjl3q/BTpUFVn1RTUuqfOTwGFNMmAOj9FOqeglp6yBTXQrFrdKaRJZtT5KdKZrILalJFs3wIU1JJRUKuvvrwLKKIfnnkVIzO3T7rc9weB90y+vv7tM3nNN8/pvbAKOGLNem578KXwLjhr7p15lyNNdo+O0d/3V+weHWNK39S8y6m9fdY7W5dYovs+uPvTjLF10uXOfaCz9U2ZMpuDF38yUS2tGkFt6UFPBVlfErdtWM5JC9fmtv0kvr3lRRybdxEFNzY6xrSplzI2OsbUioxhmklro5OAluf6yk7n/CymHYNbmGIPsWNwS96lSCzpjFonAa0bu3cPBV0f5D+rVsbOz8GxmXmXUGhDg0OYPcTQYPjXa14U0iQXOudnseweHWNkaBtmzsjQNnaPjuVdksSy6vzMQ95BDcr39ae++mxvbHSM7Vu3Y+Zs37qdsYqMYQppkhud87M4dgxugUYOcDSbVkAKaukpY1BTWNvT0ODQHmNYVWbTFNIkV+r8zF9jFq2ZZtOKSUEtPWULaqBZtYbGLFqzqsymKaRJIajzMz97zKI1aDatsBTU0qOgVk57zKI1VGQ2TSFNCkPn/Mxeu1m0Bs2mFVdVg9rwSF/uYU1BrVzazaI1VGE2LWhIM7P9zexmM9tmZuvN7IxxljMz+7yZPR1f1phZsl5zqRR1fmar7SxaQ81m08o2flU1qEH+s2pl7Pysa1BrO4vWUIHZtNAzaZcDI8AC4EzgCjM7qs1yq4CVwArgBcAfAu8NXIuUlDo/szHRLFpDzWbTSjd+Zdn5WcczFGzZNT3vErpSt6A20SxaQ9ln04KFNDObBZwGXODuQ+5+B/Ad4Kw2i78duMTdH3P3x4FLgHeEqkXKT52f6ZtwFq2hJrNpZR+/FNTSU8YZtbqEtQln0RpKPptm7mH+uM3shcCd7j6j6brzgFe5+5talt0M/IG7/3v887HAj9x9nzbrXUX0yZV58+Yd89kLvhCk3omsGjw7+DqvnPv14OtsZ+7CWQxumHh2JEsh6hle2M+y/Z4MUs+unQuYNn1jkHWFkF89m5k+7SLMdk26pPs0du76NDAn/bLaeMPrPni3u6d6sPWsxq+L/uJLKT4K2N0ffet67gN/HHzdXzr875q2szv4+gEWTB1g49jwXtcP9I+msr3J7L97JpumRDM1c6btzKWGZgMj+zHc/0zHy8+dmv6B1Id3LmRg+obUt7O3zfT3/VnHY9jI6KfIYww7+Q8+1NP4FfK0ULOBzS3XbQb2GrjaLLsZmG1m5i2p0d2vBK4EWLr4EL9pzV3hKh5PB6d66lYmdQOnrj4us211IlQ9969ewqmv+mnPp5J6Yu1qFi1f03M9oeRVz7anBhnZOvngBmC2i30P+Byz5s9NuapcpT5+LVnyXL/q9sfDVTyOpKeSmsylv9mz9uHFI8G38bHZS7hkaH3b2/I4jdQZ24/m+pk/f/bnvE8ltezRlTx48C1d3ef0OfekVE1k3drzWbr84lS30c7mpzazfUvnY9jcAz7HvvP3Tbmq8ELukzbE3jF1DrQ9P0nrsnOAodYBTqRBnZ/hdLIvWqsa7JuWyfi174N7zxKFVuWvPvP++rNsX31CNfdT62RftFZl3TctZEh7AOgzs8OarlsB3Ndm2fvi2yZbTuRZ6vwMo6N90VpVf9+0zMavfR8cziSsZSHroAb576emzs/8dbQvWquS7psWLKS5+zbgJuAiM5tlZscDbwaua7P414GPmtmBZrYI+BhwbahapLrU+dmbJLNoDVWeTctj/KpSUFNDQfFVJaglmUVrKONsWuhDcHwAmAE8CdwAvN/d7zOzE8ysOcJ+FbgV+BVwL/Dd+DqRSanzM7lEs2gN1Z9Ny3z8qkpQA3V+lkEVOj8TzaI1lHA2LWhIc/dN7r7S3We5+2J3vz6+/nZ3n920nLv7anffP76s1v5o0g2d87N7vcyiNVR8Ni2X8UtBLTkFtWTKGtR6mUVrKNtsmk4LJaWmc352rqdZtIbqz6blQkEtOQW1ZMoY1HqaRWso2WyaQpqUnjo/JxdiFq2hyrNpeVJQS06dn8mUKaiFmEVrKNNsmkKaVII6PycWZBatQbNpqVHnZ2+KENTKFtbKEtSCzKI1lGg2TSGtjf7tMwu9PmlPnZ/jGxsOe+DR0OuTPfUa1PrG2h2DN7mpbY/pOzl1fpZDGYLayM6wY07o9aUl5BkHKuM13zyno+WKdnR/aXR+Hsgpb/gwN6/8Yt7lFMacgxZ0tFzRzshQZ/s+OMzmZQOJ7rviiQs7Wu6cEw7ki488kWgb3Rh4pD+VMxSMZ91j83M5Q0Gz2zYsz/0MBd1oBLW0z1CQ1PyDOwvfeZ0BIS2aSZPKUeenVIXOUJCcZtSSKcOsWp0opEllqfNTqkBBLTkFtWQU1IpDIU0qTZ2fUgUKasmp8zMZBbViUEiTylPnp1RBFp2fVQ1qkP+smjo/JQmFNKmFRufnwzsOyLsUkZ5kEdSyCGvq/CwHBbV8KaRJbcy493H6npyihgIpPX39mZyCWveqcM7PslJIk1qxHbvU+SmVoKCWnIJaMgpq2VNIk1pS56dUgYJacgpqySioZUshTWpLnZ9SBVUKalNGsn1LUudnMgpq2VFIk1pT56dUgTo/e1OEoFa2sKaglg2FNKk9nfNTsmCefshR52dyeQc1KN+smoJa+hTSRGic83OWGgokVf1rH6N/7WOpbqNKX38qqBXf4NhMhbUUKaSJxHTOT8mKglrnFNTKQUEtHQppIi3U+SlZUFDrnIJaOSiohaeQJtKGOj8lCwpqncsjqA2P9GW6zVYKaqKQJjIOdX5KFrIIaur8TC7vWTV1ftZbkJBmZvub2c1mts3M1pvZGRMs+3Ezu9fMtprZw2b28RA1iKRBnZ/1kPcYlnZQA3V+9iLvoAblm1VTUAsj1Eza5cAIsAA4E7jCzI4aZ1kDzgbmAicD55rZWwLVIRKcOj9rIfcxTJ2f3aljUNuya3reJXRF5/zsXc8hzcxmAacBF7j7kLvfAXwHOKvd8u6+xt3vcfdRd78f+Hvg+F7rEEmTOj+rq2hjmIJa5+oY1Mo2owaaVeuFeY8HWDSzFwJ3uvuMpuvOA17l7m+a5L4G3AN81d2/Ms4yq4BV8Y/PB+7tqeCw5gG/zbuIFkWrSfVMTPVM7gh33yetlac5hhV8/ILi/b5Vz8SKVg8Ur6ai1dPT+BWidWU2sLnlus1AJ0VdSDSbd814C7j7lcCVAGb2M3c/NlmZ4RWtHiheTapnYqpncmb2s5Q3kdoYVuTxC4pXk+qZWNHqgeLVVMR6ern/pF93mtmPzczHudwBDAFzWu42B9g6yXrPJdqv443unv78u4jUksYwESmrSWfS3P3EiW6P9+foM7PD3P3X8dUrgPsmuM+7gPOBV7p7+m1NIlJbGsNEpKx6bhxw923ATcBFZjbLzI4H3gxc1255MzsT+Cxwkrs/1OXmruyp2PCKVg8UrybVMzHVM7lUa8pwDKvdc5uA6plY0eqB4tVUqXp6bhyA6BhDwNXAScDTwPnufn182wnA99x9dvzzw8BBQPPXA99w9/f1XIiISAIaw0SkiIKENBEREREJS6eFEhERESkghTQRERGRAip0SMv7fHrd1GCRz5vZ0/FlTXygy6C6qCeTc6R28zuKl+83s7VmlkpHXJevmReZ2b+a2ZCZbTSzD+VVj5kNmNlX4jo2mdmtZnZgCvWca2Y/M7NhM7t2kmU/YmYbzGyzmV1tZgOh6+mmJjN7u5ndbWZbzOyx+G8sxLEeU6Hxq6d6MjvHs8awMPXUdQxLe/wqdEijAOfT66KGVcBKotb9FwB/CLw3wPaT1pPVOVK7+R0BfBx4MoU6uqrHzOYB3we+ChwAHAr8U171AB8CXkb02lkEPANclkI9TwCfIdpJflxm9jqiQ0y8FlgKPBf40xTq6bgmYCbwYaIjir8kru28lGoKQeNX8nqyPMezxrAA9VDfMSzd8cvdC3kBZhG9MA5vuu464OIO738pcFlWNQB3Aquafj4H+ElRnpMQz0ev9QCHAP8JvB54LM/XDNEhFK4LXUMP9VwBrGn6+Y3A/SnW9hng2gluvx74bNPPrwU2pPx8TVhTm+U/CtyaZk1Z/O7Hub/Gr8DPR4iaNIZpDEtaT5vlOxq/ijyTdjgw5u4PNF33C2CiTzjAs+fTO4EJDkaZQg1HxbdNtlxW9Twr4PPRaz2XAZ8AdgSuI0k9LwU2mdmdZvZkPDW/OMd6rgKON7NFZjaT6BPr9wLX0412r+cFZnZATvW080rCv6ZD0fjVWz3PSnH8SlKTxjCNYaF0NH4VOaSlek7QFGpoXXYzMDvwfh1Jn5MLCfN8JK7HzE4B+tz95sA1JKqH6DhXbyeaol8MPAzckGM9DwCPAI8DW4AjgYsC19ONdq9n6OzvL3Vm9k7gWOAv8q5lHBq/equn2YWkM351VZPGsEnr0RjWoW7Gr9xCmpXjfHrd1NC67BxgyON5zUC6fk4CPx+J6rHotDtrgP8n8PYT1RPbAdzs7ne5+06ifRVebmb75lTPFcB0on1LZhEdAT/PT6HtXs8wyd9fFsxsJXAx8Hp3/21ONWj8SrceIJPzo2oMC1ePxrAOdDt+5RbS3P1Ed7dxLq8gSuV9ZnZY0906PZ/eaz3M+fS6qeG++LaOas2gnjSej6T1HEa04+btZraB6I/39+Kum6U51APwS6D5Dajx/5AzB93Us4Jof4ZN8ZvRZcCL452D89Du9bzR3Z/OqR4AzOxk4K+BN7n7r/KqQ+NX6vVkMX51U5PGsMnr0Rg2iUTjV1o70QXaEe9viaZvZwHHE01XHjXOsmcCG4Aj86gBeB/RDqUHEnW23Ae8L6/nJK3nI0k9QB+wsOlyKlFHzEJgak7Pz2uAQeBoYBrwl8DtOf6+rgFuBPaN6/kE8HgK9fQRfdr9HNEOwNOJvsJpXe7k+PXzPKIOux/S4U7vKdb0GqJTNr0yzdd01r/7eFmNXxk8H0lr0himMSxAPYnGr1Rf/AEe/P7ALcA2ou+6z2i67QSi6fjGzw8Du4imOBuXr6RVQ5vtG9F0+Kb4sob4tFtZPCdZPR9J62m5z4mk0BnVbT3A+4n2nxgEbgUOzvH3dQDwTaLW/meAO4AXp1DPhUSfuJsvFxLt0zIELG5a9qPARqL9S64BBlL6nXVUE/AjYLTlNf29NGpK83c/zu9f41cO41c3NbXc50Q0hmkM66IeEo5fOneniIiISAEVubtTREREpLYU0kREREQKSCFNREREpIAU0kREREQKSCFNREREpIAU0kREREQKSCFNREREpIAU0kREREQK6P8HwdgJbcJzZ/IAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 720x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x1s = np.linspace(-0.2, 1.2, 100)\n",
    "x2s = np.linspace(-0.2, 1.2, 100)\n",
    "x1, x2 = np.meshgrid(x1s, x2s)\n",
    "\n",
    "z1 = mlp_xor(x1, x2, activation=heaviside)\n",
    "z2 = mlp_xor(x1, x2, activation=sigmoid)\n",
    "\n",
    "plt.figure(figsize=(10,4))\n",
    "\n",
    "plt.subplot(121)\n",
    "plt.contourf(x1, x2, z1)\n",
    "plt.plot([0, 1], [0, 1], \"gs\", markersize=20)\n",
    "plt.plot([0, 1], [1, 0], \"y^\", markersize=20)\n",
    "plt.title(\"Activation function: heaviside\", fontsize=14)\n",
    "plt.grid(True)\n",
    "\n",
    "plt.subplot(122)\n",
    "plt.contourf(x1, x2, z2)\n",
    "plt.plot([0, 1], [0, 1], \"gs\", markersize=20)\n",
    "plt.plot([0, 1], [1, 0], \"y^\", markersize=20)\n",
    "plt.title(\"Activation function: sigmoid\", fontsize=14)\n",
    "plt.grid(True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Building an Image Classifier"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First let's import TensorFlow and Keras."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "import tensorflow as tf\n",
    "from tensorflow import keras"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'2.0.0-dev20190405'"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tf.__version__"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'2.2.4-tf'"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "keras.__version__"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's start by loading the fashion MNIST dataset. Keras has a number of functions to load popular datasets in `keras.datasets`. The dataset is already split for you between a training set and a test set, but it can be useful to split the training set further to have a validation set:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "fashion_mnist = keras.datasets.fashion_mnist\n",
    "(X_train_full, y_train_full), (X_test, y_test) = fashion_mnist.load_data()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The training set contains 60,000 grayscale images, each 28x28 pixels:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(60000, 28, 28)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train_full.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Each pixel intensity is represented as a byte (0 to 255):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dtype('uint8')"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train_full.dtype"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's split the full training set into a validation set and a (smaller) training set. We also scale the pixel intensities down to the 0-1 range and convert them to floats, by dividing by 255."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_valid, X_train = X_train_full[:5000] / 255., X_train_full[5000:] / 255.\n",
    "y_valid, y_train = y_train_full[:5000], y_train_full[5000:]\n",
    "X_test = X_test / 255."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can plot an image using Matplotlib's `imshow()` function, with a `'binary'`\n",
    " color map:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(X_train[0], cmap=\"binary\")\n",
    "plt.axis('off')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The labels are the class IDs (represented as uint8), from 0 to 9:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([4, 0, 7, ..., 3, 0, 5], dtype=uint8)"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here are the corresponding class names:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "class_names = [\"T-shirt/top\", \"Trouser\", \"Pullover\", \"Dress\", \"Coat\",\n",
    "               \"Sandal\", \"Shirt\", \"Sneaker\", \"Bag\", \"Ankle boot\"]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "So the first image in the training set is a coat:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Coat'"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "class_names[y_train[0]]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The validation set contains 5,000 images, and the test set contains 10,000 images:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(5000, 28, 28)"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_valid.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(10000, 28, 28)"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_test.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's take a look at a sample of the images in the dataset:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure fashion_mnist_diagram\n"
     ]
    },
    {
     "data": {
      "image/png": "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50o/ZNR98MEH3jkSFi1a5N/Lgfr73/++mbefP/pRVeV2O//6178OwHPPPQe4viHnT8+5vb3dE2v67He/+x0AX/va17Ku3dbW5s/fCAamwavO9O1vfxuAV155BXAed1GRI6zlWRcUFHjPU5/tsMMOAFxwwQWceuqpXb2NXle2hx9+mCeeeAKAk046CYBly5ZRUVEB4A1fedfXXHON76TqhG+99RajRo0C4Ic//CEA3/jGNwB4+eWXvawGDx4MwN13380RRxwB5B60AkSDNxt5MyDlCaI80hHlkY68kce557qdl1966SUgNaFvtdVWLFmyBMCPu0OHDqWhoQFwBg/AOeecAzgGbwvY3l6XR66o5w033MB9990HwPvvu8qVQ4e63aJnzJjhjXzZEffddx+vv/46kGLBJ050O84ff/zxnH322WnXb29v31TZ9Kl+6L6rq6v9HCrI8C0rK/MGrPSjqKjIk0yC7JTa2lr/XTkRuYy+DtBr8sjlnDz//POAsyPeeOMNAIYNGwbA6NGjAVi1apU/X5EAwDPeY8eOBfB9asSIEfz0p27jtS7YZpskj5jDGxERERERERERMaCR1wxvLu94zJgxQMrrHj7cbbduraW4uBhIeZaFhYU+vUFQCGbChAnes8h5g52HXHrd27z++uv56KOPANh5550B2GabbfzxsrIyIMUytLe3+xyZDRs2ALDvvvtSWVkJOLYCYMGCBQC0tLR4eS9dutQfE9t73nnndXZ7keHNRt4wVnmCKI90RHmkIy/kccMNN3D11VcDMG3aNCA1Z6xdu9azWPX19YAL5W+99dYArFixIu2YmK8uotflEbKtv//97wGXziGGVvOqIodLlizx84LmkVmzZjF+/HggxXJqDv7oo48488wzAbjyyis39/77RD+01uWyyy4DHDupHNzMVAUxt5BKVWhsbPS2iuQhPSkqKvLfEQt88803b3T9TYI+kcdtt90GpOTR3t7u7S7ZD7JFVqxYwaRJk4CUDsyZM8czu+pLLS0tgLO1ZKtoHZGiLNA9NllkeCMiIiIiIiIiIgY0+qpKw0aRK7enurraM7zyIsRA7rjjjj6/Vx7AmDFjvGfx4YcfAum5V6+99hoAe+65Z9rvwhavsO12vPnmmz5Pt6amBnDeoxaklZSUAClPcdiwYd4TVdJ3a2sr69evB1z+L6TkCClPSwn3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\n",
      "text/plain": [
       "<Figure size 864x345.6 with 40 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "n_rows = 4\n",
    "n_cols = 10\n",
    "plt.figure(figsize=(n_cols * 1.2, n_rows * 1.2))\n",
    "for row in range(n_rows):\n",
    "    for col in range(n_cols):\n",
    "        index = n_cols * row + col\n",
    "        plt.subplot(n_rows, n_cols, index + 1)\n",
    "        plt.imshow(X_train[index], cmap=\"binary\", interpolation=\"nearest\")\n",
    "        plt.axis('off')\n",
    "        plt.title(class_names[y_train[index]], fontsize=12)\n",
    "plt.subplots_adjust(wspace=0.2, hspace=0.5)\n",
    "save_fig('fashion_mnist_diagram', tight_layout=False)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /Users/ageron/.virtualenvs/tf2/lib/python3.6/site-packages/tensorflow/python/ops/resource_variable_ops.py:655: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Colocations handled automatically by placer.\n"
     ]
    }
   ],
   "source": [
    "model = keras.models.Sequential()\n",
    "model.add(keras.layers.Flatten(input_shape=[28, 28]))\n",
    "model.add(keras.layers.Dense(300, activation=\"relu\"))\n",
    "model.add(keras.layers.Dense(100, activation=\"relu\"))\n",
    "model.add(keras.layers.Dense(10, activation=\"softmax\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(42)\n",
    "tf.random.set_seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = keras.models.Sequential([\n",
    "    keras.layers.Flatten(input_shape=[28, 28]),\n",
    "    keras.layers.Dense(300, activation=\"relu\"),\n",
    "    keras.layers.Dense(100, activation=\"relu\"),\n",
    "    keras.layers.Dense(10, activation=\"softmax\")\n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<tensorflow.python.keras.layers.core.Flatten at 0x12ae25160>,\n",
       " <tensorflow.python.keras.layers.core.Dense at 0x12ae79be0>,\n",
       " <tensorflow.python.keras.layers.core.Dense at 0x12ae899e8>,\n",
       " <tensorflow.python.keras.layers.core.Dense at 0x12ae89160>]"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.layers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "flatten_1 (Flatten)          (None, 784)               0         \n",
      "_________________________________________________________________\n",
      "dense_3 (Dense)              (None, 300)               235500    \n",
      "_________________________________________________________________\n",
      "dense_4 (Dense)              (None, 100)               30100     \n",
      "_________________________________________________________________\n",
      "dense_5 (Dense)              (None, 10)                1010      \n",
      "=================================================================\n",
      "Total params: 266,610\n",
      "Trainable params: 266,610\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model.summary()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Warning**: the following 2 cells do not work yet due to [TensorFlow issue 24622](https://github.com/tensorflow/tensorflow/issues/24622) (you are using a preview version of TensorFlow, hence there are still a few issues).\n",
    "You can work around this issue by applying [PR 24626](https://github.com/tensorflow/tensorflow/pull/24625/files) to your copy of `tensorflow/python/keras/utils/vis_utils.py`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "#keras.utils.plot_model(model, \"my_mnist_model.png\", show_shapes=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<img src=\"my_mnist_model.png\" />\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%%html\n",
    "<img src=\"my_mnist_model.png\" />"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Warning**: the following cell does not work yet due to [TensorFlow issue 24622](https://github.com/tensorflow/tensorflow/issues/24622) and [TensorFlow issue 24639](https://github.com/tensorflow/tensorflow/issues/24639).\n",
    "You can work around issue 24639 by writing `from tensorflow.keras.utils.vis_utils import model_to_dot`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "from IPython.display import SVG\n",
    "#SVG(keras.utils.model_to_dot(model, show_shapes=True).create(prog='dot', format='svg'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'dense_3'"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "hidden1 = model.layers[1]\n",
    "hidden1.name"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'dense_3'"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.get_layer(hidden1.name).name"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "weights, biases = hidden1.get_weights()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.02448617, -0.00877795, -0.02189048, ..., -0.02766046,\n",
       "         0.03859074, -0.06889391],\n",
       "       [ 0.00476504, -0.03105379, -0.0586676 , ...,  0.00602964,\n",
       "        -0.02763776, -0.04165364],\n",
       "       [-0.06189284, -0.06901957,  0.07102345, ..., -0.04238207,\n",
       "         0.07121518, -0.07331658],\n",
       "       ...,\n",
       "       [-0.03048757,  0.02155137, -0.05400612, ..., -0.00113463,\n",
       "         0.00228987,  0.05581069],\n",
       "       [ 0.07061854, -0.06960931,  0.07038955, ..., -0.00384101,\n",
       "         0.00034875,  0.02878492],\n",
       "       [-0.06022581,  0.01577859, -0.02585464, ..., -0.00527829,\n",
       "         0.00272203, -0.06793761]], dtype=float32)"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "weights"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(784, 300)"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "weights.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32)"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "biases"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(300,)"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "biases.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.compile(loss=\"sparse_categorical_crossentropy\",\n",
    "              optimizer=\"sgd\",\n",
    "              metrics=[\"accuracy\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This is equivalent to:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.compile(loss=keras.losses.sparse_categorical_crossentropy,\n",
    "              optimizer=keras.optimizers.SGD(),\n",
    "              metrics=[keras.metrics.sparse_categorical_accuracy])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 55000 samples, validate on 5000 samples\n",
      "Epoch 1/50\n",
      "55000/55000==============================] - 3s 60us/sample - loss: 1.4948 - sparse_categorical_accuracy: 0.5757 - val_loss: 1.0042 - val_sparse_categorical_accuracy: 0.7168\n",
      "Epoch 2/50\n",
      "55000/55000==============================] - 3s 51us/sample - loss: 0.8690 - sparse_categorical_accuracy: 0.7319 - val_loss: 0.7549 - val_sparse_categorical_accuracy: 0.7616\n",
      "Epoch 3/50\n",
      "55000/55000==============================] - 3s 51us/sample - loss: 0.7176 - sparse_categorical_accuracy: 0.7667 - val_loss: 0.6611 - val_sparse_categorical_accuracy: 0.7890\n",
      "Epoch 4/50\n",
      "55000/55000==============================] - 3s 53us/sample - loss: 0.6459 - sparse_categorical_accuracy: 0.7891 - val_loss: 0.6049 - val_sparse_categorical_accuracy: 0.8094\n",
      "Epoch 5/50\n",
      "55000/55000==============================] - 3s 53us/sample - loss: 0.5995 - sparse_categorical_accuracy: 0.8039 - val_loss: 0.5691 - val_sparse_categorical_accuracy: 0.8186\n",
      "Epoch 6/50\n",
      "55000/55000==============================] - 3s 53us/sample - loss: 0.5673 - sparse_categorical_accuracy: 0.8131 - val_loss: 0.5432 - val_sparse_categorical_accuracy: 0.8240\n",
      "Epoch 7/50\n",
      "55000/55000==============================] - 3s 53us/sample - loss: 0.5433 - sparse_categorical_accuracy: 0.8196 - val_loss: 0.5230 - val_sparse_categorical_accuracy: 0.8322\n",
      "Epoch 8/50\n",
      "55000/55000==============================] - 3s 56us/sample - loss: 0.5245 - sparse_categorical_accuracy: 0.8249 - val_loss: 0.5057 - val_sparse_categorical_accuracy: 0.8358\n",
      "Epoch 9/50\n",
      "55000/55000==============================] - 3s 48us/sample - loss: 0.5094 - sparse_categorical_accuracy: 0.8293 - val_loss: 0.4926 - val_sparse_categorical_accuracy: 0.8360\n",
      "Epoch 10/50\n",
      "55000/55000==============================] - 3s 50us/sample - loss: 0.4970 - sparse_categorical_accuracy: 0.8323 - val_loss: 0.4841 - val_sparse_categorical_accuracy: 0.8368\n",
      "Epoch 11/50\n",
      "55000/55000==============================] - 3s 51us/sample - loss: 0.4865 - sparse_categorical_accuracy: 0.8359 - val_loss: 0.4710 - val_sparse_categorical_accuracy: 0.8422\n",
      "Epoch 12/50\n",
      "55000/55000==============================] - 3s 61us/sample - loss: 0.4774 - sparse_categorical_accuracy: 0.8382 - val_loss: 0.4673 - val_sparse_categorical_accuracy: 0.8436\n",
      "Epoch 13/50\n",
      "55000/55000==============================] - 3s 51us/sample - loss: 0.4694 - sparse_categorical_accuracy: 0.8412 - val_loss: 0.4611 - val_sparse_categorical_accuracy: 0.8456\n",
      "Epoch 14/50\n",
      "55000/55000==============================] - 3s 47us/sample - loss: 0.4628 - sparse_categorical_accuracy: 0.8428 - val_loss: 0.4522 - val_sparse_categorical_accuracy: 0.8508\n",
      "Epoch 15/50\n",
      "55000/55000==============================] - 3s 52us/sample - loss: 0.4564 - sparse_categorical_accuracy: 0.8436 - val_loss: 0.4465 - val_sparse_categorical_accuracy: 0.8516\n",
      "Epoch 16/50\n",
      "55000/55000==============================] - 3s 52us/sample - loss: 0.4506 - sparse_categorical_accuracy: 0.8457 - val_loss: 0.4418 - val_sparse_categorical_accuracy: 0.8494\n",
      "Epoch 17/50\n",
      "55000/55000==============================] - 3s 48us/sample - loss: 0.4453 - sparse_categorical_accuracy: 0.8474 - val_loss: 0.4389 - val_sparse_categorical_accuracy: 0.8510\n",
      "<<31 more lines>>\n",
      "55000/55000==============================] - 3s 61us/sample - loss: 0.3933 - sparse_categorical_accuracy: 0.8652 - val_loss: 0.3934 - val_sparse_categorical_accuracy: 0.8678\n",
      "Epoch 34/50\n",
      "55000/55000==============================] - 4s 64us/sample - loss: 0.3910 - sparse_categorical_accuracy: 0.8641 - val_loss: 0.3965 - val_sparse_categorical_accuracy: 0.8636\n",
      "Epoch 35/50\n",
      "55000/55000==============================] - 3s 63us/sample - loss: 0.3883 - sparse_categorical_accuracy: 0.8654 - val_loss: 0.3891 - val_sparse_categorical_accuracy: 0.8678\n",
      "Epoch 36/50\n",
      "55000/55000==============================] - 3s 56us/sample - loss: 0.3866 - sparse_categorical_accuracy: 0.8658 - val_loss: 0.3915 - val_sparse_categorical_accuracy: 0.8668\n",
      "Epoch 37/50\n",
      "55000/55000==============================] - 3s 57us/sample - loss: 0.3845 - sparse_categorical_accuracy: 0.8672 - val_loss: 0.3868 - val_sparse_categorical_accuracy: 0.8682\n",
      "Epoch 38/50\n",
      "55000/55000==============================] - 3s 61us/sample - loss: 0.3820 - sparse_categorical_accuracy: 0.8673 - val_loss: 0.3846 - val_sparse_categorical_accuracy: 0.8704\n",
      "Epoch 39/50\n",
      "55000/55000==============================] - 3s 56us/sample - loss: 0.3800 - sparse_categorical_accuracy: 0.8686 - val_loss: 0.3866 - val_sparse_categorical_accuracy: 0.8688\n",
      "Epoch 40/50\n",
      "55000/55000==============================] - 3s 53us/sample - loss: 0.3782 - sparse_categorical_accuracy: 0.8686 - val_loss: 0.3863 - val_sparse_categorical_accuracy: 0.8700\n",
      "Epoch 41/50\n",
      "55000/55000==============================] - 3s 53us/sample - loss: 0.3764 - sparse_categorical_accuracy: 0.8691 - val_loss: 0.3846 - val_sparse_categorical_accuracy: 0.8670\n",
      "Epoch 42/50\n",
      "55000/55000==============================] - 3s 57us/sample - loss: 0.3745 - sparse_categorical_accuracy: 0.8697 - val_loss: 0.3784 - val_sparse_categorical_accuracy: 0.8720\n",
      "Epoch 43/50\n",
      "55000/55000==============================] - 3s 55us/sample - loss: 0.3725 - sparse_categorical_accuracy: 0.8710 - val_loss: 0.3778 - val_sparse_categorical_accuracy: 0.8702\n",
      "Epoch 44/50\n",
      "55000/55000==============================] - 3s 55us/sample - loss: 0.3709 - sparse_categorical_accuracy: 0.8709 - val_loss: 0.3847 - val_sparse_categorical_accuracy: 0.8672\n",
      "Epoch 45/50\n",
      "55000/55000==============================] - 3s 55us/sample - loss: 0.3691 - sparse_categorical_accuracy: 0.8711 - val_loss: 0.3771 - val_sparse_categorical_accuracy: 0.8694\n",
      "Epoch 46/50\n",
      "55000/55000==============================] - 3s 51us/sample - loss: 0.3675 - sparse_categorical_accuracy: 0.8720 - val_loss: 0.3756 - val_sparse_categorical_accuracy: 0.8704\n",
      "Epoch 47/50\n",
      "55000/55000==============================] - 3s 51us/sample - loss: 0.3659 - sparse_categorical_accuracy: 0.8727 - val_loss: 0.3731 - val_sparse_categorical_accuracy: 0.8716\n",
      "Epoch 48/50\n",
      "55000/55000==============================] - 3s 52us/sample - loss: 0.3643 - sparse_categorical_accuracy: 0.8731 - val_loss: 0.3733 - val_sparse_categorical_accuracy: 0.8698\n",
      "Epoch 49/50\n",
      "55000/55000==============================] - 3s 50us/sample - loss: 0.3623 - sparse_categorical_accuracy: 0.8738 - val_loss: 0.3724 - val_sparse_categorical_accuracy: 0.8710\n",
      "Epoch 50/50\n",
      "55000/55000==============================] - 3s 50us/sample - loss: 0.3607 - sparse_categorical_accuracy: 0.8752 - val_loss: 0.3707 - val_sparse_categorical_accuracy: 0.8728\n"
     ]
    }
   ],
   "source": [
    "history = model.fit(X_train, y_train, epochs=50,\n",
    "                    validation_data=(X_valid, y_valid))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'batch_size': 32,\n",
       " 'epochs': 50,\n",
       " 'steps': None,\n",
       " 'samples': 55000,\n",
       " 'verbose': 0,\n",
       " 'do_validation': True,\n",
       " 'metrics': ['loss', 'acc', 'val_loss', 'val_acc']}"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "history.params"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49]\n"
     ]
    }
   ],
   "source": [
    "print(history.epoch)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_keys(['loss', 'acc', 'val_loss', 'val_acc'])"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "history.history.keys()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure keras_learning_curves_graph\n"
     ]
    },
    {
     "data": {
      "image/png": "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IiIiIoNMAUdEREQ8RwFHREREPEcBR0RERDxHAUdEREQ8RwFHREREPEcBR0RERDxHAUdEREQ8RwFHREREPEcBR0RERDxHAUdEREQ8RwFHREREPEcBR0RERDxHAUdEREQ8RwFHREREPEcBR0RERDxHAUdEREQ8RwFHREREPEcBR0RERDxHAUdEREQ8RwFHREREPEcBR0RERDxHAUdEREQ8RwFHREREPEcBR0RERDxHAUdEREQ8RwFHREREPEcBR0RERDxHAUdEREQ8RwFHREREPEcBR0RERDxHAUdEREQ8RwFHREREPEcBR0RERDxHAUdEREQ8RwFHREREPEcBR0RERDxHAUdEREQ8RwFHREREPEcBR0RERDxHAUdEREQ8J5DtCpxMIpFg3759xOPx0z5XUVERO3bsGIRajTzhcJjx48cTDAazXRUREZERY8QGnH379lFQUMCECRMws9M6VzQapaCgYJBqNnI456irq2Pfvn1MnDgx29UREREZMUbsJap4PM6oUaNOO9x4mZkxatSoQenlEhER8ZIRG3AAhZsM6DcSERE5XkYBx8xKzWytmTWZ2R4zW3iS/R40s4/NLGpmu83swcGtroiIiEj/Mh2DswJoA8qBacBrZrbFObet134G/BOwFTgP+A8z+9w599JgVXg4RSIRYrFYtqshIiIip6jfHhwzywfmA48652LOuXeBV4Fv997XOfdD59xHzrl259xfgFeArw52pUVERET6kkkPzgVAu3NuV7eyLcCcvg6y1OCQ2cC/nmT7ncCdAOXl5axfv77H9qKiIqLRKABP/sdf2Xlo4D0pzrnjxqpMLo/w0NXn9XtsNBrFOcejjz7Km2++iZnx4IMPMn/+fA4ePMgtt9xCNBqlvb2dH/3oR3zpS1/innvu4c9//jNmxs0338y999474LpnIh6PH/f7jTSxWGzE1/FsoHbIPrXByKB2yL6hboNMAk4EaOxV1gD0d9/1Y6R6iH5+oo3OuZXASoAZM2a4K664osf2HTt2dN3aHcwJ4vf7M6jqiSWTyeOOD+YEM7p1vKCggF/96lds376d6upqamtrmTlzJvPmzePVV1/lmmuu4eGHHyaZTNLc3MyuXbs4fPgw27dvB+Do0aNDfot6OBxm+vTpQ/oZp2v9+vX0bmMZfmqH7FMbjAxqh+wb6jbIJODEgMJeZYVA9GQHmNm9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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "\n",
    "pd.DataFrame(history.history).plot(figsize=(8, 5))\n",
    "plt.grid(True)\n",
    "plt.gca().set_ylim(0, 1)\n",
    "save_fig(\"keras_learning_curves_graph\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10000/10000==============================] - 0s 34us/sample - loss: 0.4074 - acc: 0.8541\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[0.4073760202884674, 0.8541]"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.evaluate(X_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.  , 0.  , 0.  , 0.  , 0.  , 0.09, 0.  , 0.12, 0.  , 0.79],\n",
       "       [0.  , 0.  , 0.94, 0.  , 0.02, 0.  , 0.04, 0.  , 0.  , 0.  ],\n",
       "       [0.  , 1.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  ]],\n",
       "      dtype=float32)"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_new = X_test[:3]\n",
    "y_proba = model.predict(X_new)\n",
    "y_proba.round(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([9, 2, 1])"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pred = model.predict_classes(X_new)\n",
    "y_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['Ankle boot', 'Pullover', 'Trouser'], dtype='<U11')"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.array(class_names)[y_pred]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([9, 2, 1], dtype=uint8)"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_new = y_test[:3]\n",
    "y_new"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Regression MLP"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's load, split and scale the California housing dataset (the original one, not the modified one as in chapter 2):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import fetch_california_housing\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "housing = fetch_california_housing()\n",
    "\n",
    "X_train_full, X_test, y_train_full, y_test = train_test_split(housing.data, housing.target, random_state=42)\n",
    "X_train, X_valid, y_train, y_valid = train_test_split(X_train_full, y_train_full, random_state=42)\n",
    "\n",
    "scaler = StandardScaler()\n",
    "X_train = scaler.fit_transform(X_train)\n",
    "X_valid = scaler.transform(X_valid)\n",
    "X_test = scaler.transform(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(42)\n",
    "tf.random.set_seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 11610 samples, validate on 3870 samples\n",
      "Epoch 1/20\n",
      "11610/11610==============================] - 1s 44us/sample - loss: 1.6343 - val_loss: 0.9361\n",
      "Epoch 2/20\n",
      "11610/11610==============================] - 0s 32us/sample - loss: 0.7053 - val_loss: 0.6556\n",
      "Epoch 3/20\n",
      "11610/11610==============================] - 0s 33us/sample - loss: 0.6343 - val_loss: 0.6028\n",
      "Epoch 4/20\n",
      "11610/11610==============================] - 0s 33us/sample - loss: 0.5974 - val_loss: 0.5631\n",
      "Epoch 5/20\n",
      "11610/11610==============================] - 0s 32us/sample - loss: 0.5701 - val_loss: 0.5375\n",
      "Epoch 6/20\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.5474 - val_loss: 0.5165\n",
      "Epoch 7/20\n",
      "11610/11610==============================] - 0s 37us/sample - loss: 0.5283 - val_loss: 0.5072\n",
      "Epoch 8/20\n",
      "11610/11610==============================] - 0s 33us/sample - loss: 0.5130 - val_loss: 0.4806\n",
      "Epoch 9/20\n",
      "11610/11610==============================] - 0s 32us/sample - loss: 0.4989 - val_loss: 0.4712\n",
      "Epoch 10/20\n",
      "11610/11610==============================] - 0s 30us/sample - loss: 0.4874 - val_loss: 0.4651\n",
      "Epoch 11/20\n",
      "11610/11610==============================] - 0s 31us/sample - loss: 0.4780 - val_loss: 0.4457\n",
      "Epoch 12/20\n",
      "11610/11610==============================] - 0s 33us/sample - loss: 0.4690 - val_loss: 0.4364\n",
      "Epoch 13/20\n",
      "11610/11610==============================] - 0s 33us/sample - loss: 0.4614 - val_loss: 0.4299\n",
      "Epoch 14/20\n",
      "11610/11610==============================] - 0s 31us/sample - loss: 0.4550 - val_loss: 0.4245\n",
      "Epoch 15/20\n",
      "11610/11610==============================] - 0s 30us/sample - loss: 0.4490 - val_loss: 0.4175\n",
      "Epoch 16/20\n",
      "11610/11610==============================] - 0s 31us/sample - loss: 0.4437 - val_loss: 0.4121\n",
      "Epoch 17/20\n",
      "11610/11610==============================] - 0s 31us/sample - loss: 0.4390 - val_loss: 0.4099\n",
      "Epoch 18/20\n",
      "11610/11610==============================] - 0s 33us/sample - loss: 0.4347 - val_loss: 0.4037\n",
      "Epoch 19/20\n",
      "11610/11610==============================] - 0s 33us/sample - loss: 0.4309 - val_loss: 0.3997\n",
      "Epoch 20/20\n",
      "11610/11610==============================] - 0s 32us/sample - loss: 0.4275 - val_loss: 0.3971\n",
      "5160/5160==============================] - 0s 14us/sample - loss: 0.4213\n"
     ]
    }
   ],
   "source": [
    "model = keras.models.Sequential([\n",
    "    keras.layers.Dense(30, activation=\"relu\", input_shape=X_train.shape[1:]),\n",
    "    keras.layers.Dense(1)\n",
    "])\n",
    "model.compile(loss=\"mean_squared_error\", optimizer=\"sgd\")\n",
    "history = model.fit(X_train, y_train, epochs=20, validation_data=(X_valid, y_valid))\n",
    "mse_test = model.evaluate(X_test, y_test)\n",
    "X_new = X_test[:3]\n",
    "y_pred = model.predict(X_new)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAEACAYAAAC9Gb03AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3XecW9Wd9/HPbzTSaCRNtz2DG64YY7DBDtUxNqGk7BJCSLIkLKngbNpmN+VJ2SWFZDdPSLKb3SQPJaGFsDgk1MA6CcUGDBgwxYAxGDfcsMee4hlNL+f542rG8lgzI0/VXH3fr9d9Sbo6ks5cy99zde6555pzDhER8a+c0a6AiIgMLwW9iIjPKehFRHxOQS8i4nMKehERn1PQi4j4nIJeRMTn0gp6M/uima0zsxYzu6Wfsv9sZnvNrM7MbjKzvCGpqYiIDEi6e/R7gB8CN/VVyMzeDXwTOBc4FpgBfH8wFRQRkcFJK+idc3c75+4Fqvop+gngRufcBudcDfAD4JODq6KIiAxG7hC/3zzgvqTH64FyMytzzh3WSJjZcmA5QH5+/qIpU6YM6AM7OzvJyem/vapvc1Q1OSbHcsgdwSMT6dZvNGV6HVW/wVH9BieT67dp06YDzrnx/RZ0zqW94HXf3NLH81uA9yQ9DgIOmNbX+y5atMgN1KpVq9Iq95dX33bHfuMB98qu2gF/1kCkW7/RlOl1VP0GR/UbnEyuH7DOpZHdQ91MxYHCpMdd9+uH+HOOWmk0BEB1Q+so10REZGQNddBvABYkPV4A7HM9um1GQ4mCXkSyVLrDK3PNLAwEgICZhc0sVf/+b4HPmNkJZlYM/Ctwy5DVdhDKFPQikqXS3aP/V6AJb+jk3yfu/6uZTTWzuJlNBXDO/Rm4BlgF7ADeAr475LUegMJwkByDmkYFvYhkl7RG3Tjnvgd8r5enYz3K/gfwH4Oq1TDIyTFKIiGqtEcvIlkmM8cMDZPSaIgaBb2IZJmsCvqSaEh99CKSdbIq6EsjCnoRyT7ZFfSxkA7GikjWya6gj4SoaWyjs9ONdlVEREZMVgV9STRER6ejrrlttKsiIjJixnbQV77OjC23QltzWsV10pSIZKOxHfQ125m6827Y+UxaxbumQVA/vYhkk7Ed9NMW48iBbY+lVbw00rVHr64bEckeYzvo8wqoKzwOtqYX9CXRIADVDS3DWSsRkYwytoMeqCmZD3tegOaD/ZYti3qXr9UevYhkEx8E/QJwnbB9Tb9l80MBwsEc9dGLSFYZ80FfVzgHgpG0u29KIyGq4gp6EckeYz7oXU4Qpp6Z/gFZnR0rIllmzAc9ADOWwv7XoX5vv0VLNN+NiGQZfwT99KXebRrdN6WawVJEsow/gr5iPuSXpNV9oznpRSTb+CPoc3Jg+tneHr3re8Ky0kiI+pZ2Wts7R6hyIiKjyx9BD173Td0uqN7aZzFNgyAi2cY/QT9jmXe7dVWfxTSxmYhkG/8EfekMKJzc7wHZ7j16Bb2IZAn/BL2Zt1e//Qno7L3/vTQR9FUKehHJEv4JevDG0zfVwN6Xey1SElEfvYhkF38F/fSzvdutq3stUhLpmsFSQS8i2cFfQV9QAeOP73M8fW4gh6L8oProRSRr+Cvoweunf+tpaO99zvnSaEh99CKSNfwX9NOXQnsT7Hqu1yKlUU1sJiLZw39BP20xWE4//fQhXXxERLKG/4I+XAQTF/Y5nr40GtTlBEUka/gv6MHrp9/9PDTXpXy6NJpHTUMbrp95cURE/MCnQb8UXAe89VTKp0ujQVo7Omlo7RjhiomIjDx/Bv3k0yA33Gs/fddJU9W6pKCIZAF/Bn0wDFPP6HU8fVksEfQaeSMiWcCfQQ9eP33laxCvPOKp7mkQNJZeRLJAWkFvZqVmdo+ZNZjZW2b2sV7K5ZnZdWa2z8yqzexPZjZpaKucpq7LC257/IinNLGZiGSTdPfofwW0AuXAZcC1ZjYvRbkvA2cC84GJQA3wiyGo59E7ZoE31DLF/PSaqlhEskm/QW9mUeAS4CrnXNw5twa4H7g8RfHpwF+cc/ucc83A74FUDcLwywnAtCWw9fEjLi9YkJdLMGDqoxeRrGD9jSU3s1OAJ51zkaR1XwOWOucu7FH2HcB/AR8GaoHfAJXOuX9K8b7LgeUA5eXli1asWDGgPyAejxOLxVI+N3H3gxz35g2sPf06mvOPOey5f1rVyPzxAT59Yt6APnco6pcpMr2Oqt/gqH6Dk8n1O+ecc553zr2j34LOuT4XYAmwt8e6K4HVKcoWASsAB7QDLwKl/X3GokWL3ECtWrWq9yf3b3Luu4XOPXfTEU+9+z8fc1fc+tyAPzddfdYvQ2R6HVW/wVH9BieT6wesc/3kq3MurT76OFDYY10hUJ+i7K+APKAMiAJ3AyvT+IzhUTYLCiamHE9fGg2pj15EskI6Qb8JyDWz2UnrFgAbUpQ9GbjFOVftnGvBOxB7mpmNG3xVB8DMO0t22+NHXF6wJBpSH72IZIV+g94514C3Z361mUXNbDFwEXBbiuLPAR83syIzCwKfB/Y45w4MZaWPyvSl0FQN+149bHVpJKSrTIlIVkh3eOXngXygErgD+JxzboOZLTGzeFK5rwHNwJvAfuB9wMVDWN+jN6NrPP3hZ8mWRkMcbGqjvaP3C4mLiPhBbjqFnHPVwAdSrH8CiCU9rsIbZ585CifCuOO8fvqzvtS9ujQawjk42NRGWWx4R96IiIwm/06BkGz6Um8my/ZDXTVdJ02p+0ZE/C47gn7GUmhrhN3ruleVKehFJEtkR9BPe2fi8oKH+um7JzbTyBsR8bnsCPr8Ejjm5MPG02tiMxHJFtkR9OB13+xeBy3eIKGSaBDQxGYi4n/ZE/TTl0Jne/flBfNyA8TycqluaBvliomIDK/sCfqpZ0Ag77Dx9CXRINUNLaNYKRGR4Zc9QR/Mh6mnH3ZAtjQSorpRe/Qi4m/ZE/Tgdd/sewXi+wFNbCYi2SG7gn7GMu92u3d5wZKo5rsREf/LrqA/5mTIK+ruvtHEZiKSDbIr6AO53slTiQOypbEQTW0dNLV2jHLFRESGT3YFPXjj6Wu2Q812SnV2rIhkgewL+umJaYu3PsaUUu8yuNeu3kJnZ9/XzhURGauyL+jHz4FYBWx7jLNmlnHlkunctvYtvn3PK3Qo7EXEh9Kaj95Xui4vuPkRzDm+/b65hIMBfvHoZprbOvjphxeQG8i+9k9E/Cs7E236Umg8AJWvYWZ89YI5fP3dc7j3pT186Y4XaW3XVadExD+yM+hTXF7wC+fM4qq/PYGVr+7lH373PM1tGokjIv6QnUFfNBlKZx42HQLAZ945nX+7+EQefb2SK25dR2Nr+yhVUERk6GRn0IN3luxbT0LH4XPdXHb6sfz0wwt4assBPnnTc8RbFPYiMrZlcdAvhdY47H7+iKc+tGgy/3XpKTy/o4a//80zHNTEZyIyhmVv0E9bAtgR3TddLlwwkWsvW8hre+r46K/XaqoEERmzsjfoI6VwzPzDDsj2dMG8Cm74+CK27I9z6Q1PU1nfPIIVFBEZGtkb9OD10+98Fhqrey2ybM4Ebv7UqeyqaeLvrl/LntqmEaueiMhQyO6gn3sRuA64YZkX+L04a+Y4bvvMaRyob+Ej1z/NzurGkaujiMggZXfQT14En1oJzsFN74HHfgKdqcfPLzq2lNuvPJ365nY+fN3TbN0fH+HKiogMTHYHPXjXkv3cGph3Maz6Idzyt1C7M2XR+ZOLWbH8DNo6OvnI9Wt5Y2/9CFdWROToKegBwkVwyW/g4uth78tw3WJ49e6UReceU8jvP3smgRy49IaneXX3wRGurIjI0VHQdzGDBZfCPzwBZbPhj5+Ce78ALUd20cyaEOPOz55JJJTLR3+9lt88sVUXLxGRjKWg76l0Bnz6z7Dka/DS7XD92bD7hSOKHVsW5c5/OJMFk4v54YMbWXLNKgW+iGQkBX0qgSCcexV88gFob4Ybz4c1P4fOw2e1nFScz++uOJ07P3smcypiCnwRyUgK+r5Meyd87kk4/m/g4e/CbRdB3Z4jip02vZTbrzjjsMA/+yeruHHNNlo7dDETERldCvr+5JfAh2+F9/8Cdq2Da8+CjQ+kLNoV+L9ffgazJ8T4wQOv8fXHm7hxzTZNeywioyatoDezUjO7x8wazOwtM/tYH2UXmtnjZhY3s31m9uWhq+4oMYOFH4fPPg7FU+H3l8Gf/glaU584dfqMMv7nSi/wJ0aNHzzwGkuuWcVNCnwRGQXp7tH/CmgFyoHLgGvNbF7PQmY2DvgzcD1QBswC/jo0Vc0A42bDZx6GxV+G52+GG5bC2y/3Wvz0GWV847T87j38qxX4IjIK+g16M4sClwBXOefizrk1wP3A5SmKfwX4i3Pududci3Ou3jm3cWirPMpyQ3D+1XD5vdBcB79+F/z5W9BQ1etLuvbwVyw/g1njFfgiMrLMub4PFprZKcCTzrlI0rqvAUudcxf2KPso8ApwKt7e/DPAF5xzO1K873JgOUB5efmiFStWDOgPiMfjxGKxAb12sIKtdczYeisVex+lIxBmx9SL2TX5/XQGwn3W7/XqDu7b3MrG6k6K8ox3Tsxl8aRcJsZG55DJaG7DdKh+g6P6DU4m1++cc8553jn3jn4LOuf6XIAlwN4e664EVqcouwmoxQv6MPDfeI1En5+xaNEiN1CrVq0a8GuHTOXrzt3xMee+W+jcT2Y799yNzrW3Ouf6rt9Tmw+4T970jJvxrQfdsd94wL3/l2vcb5/a5moaWkao4p6M2IZ9UP0GR/UbnEyuH7DO9ZOvzjly02g04kBhj3WFQKqJXpqAe5xzzwGY2feBA2ZW5Jzz71wB4+fApbfDjme8YZgP/DM89Us49zvginp92ZkzyzhzZhmV9c3c9+Ie7nphF1fdt4EfPLCRc+dO4IMLJ7NszniCAQ2OEpGBSyfoNwG5ZjbbOfdmYt0CYEOKsi8DyX1B2TWIfOrp3myYm/4MD38f/vAJFhbMhmn/AdPP7vVlEwrCXHn2DK5YMp3X3q7jrud3c99Lu1n56l7KoiHef/JELlk4mXkTCzGzEfyDRMQP+g1651yDmd0NXG1mVwAnAxcBZ6UofjNwl5n9N15DcBWwxtd78z2ZwZz3wuwLYP0KQn++Cm69EGadB+d9DypO6uOlxryJRcybWMS33nc8j72xn7te2MXta3dw85PbOb6igEsWTuaikycyoTDc6/uIiCRLZ48e4PPATUAlUAV8zjm3wcyWACudczEA59yjZvZt4EEgAqwBeh1z72s5ATjlMp6tHsfZ4TfgiZ/BdUvgpA/Du/4FSqb1+fJgIIfzTijnvBPKqW1s5U/r93DXC7v5t//dyI9WbuTs48ZzycLJnH9COeFgYGT+JhEZk9IKeudcNfCBFOufAGI91l0LXDsktfOBzkAeLP5H74SrJ38Oa6+FDffAqVfA2V+D6Lh+36M4EuLyM6dx+ZnT2FwZ5+4XdnHPi7v50h0vUpCXyznHT+D8E8pZNmc8BeHgCPxVIjKWpLtHL4OVX+x13Zy2HFb/CJ69Hl78HZz1JVj0CSioSOttZk2I8X/eczxfvWAOa7dWce+Lu3nk9UruX7+HYMA4Y0YZFyR+CRxTlD+sf5KIjA0K+pFWONGbN+fML8IjV8Pqf4fH/q83gdqJH4IT3u/Nr9OPQI6xeNY4Fs8aR0en44UdNTz02j4eem0fV923gavu28CJkwo5f24F559QztxjCnQgVyRLKehHS9eQzP2b4NU/wit/gD/9Izz4Ve/A7Ukf8g7qhqL9vlUgxzh1WimnTivlW+89ni374zz0WiUPvbaXnz+yif98eBOTS/I5b245F5xQzqnTSzVkUySLKOhH2/jj4Jxvw7JvwZ4X4dW7vMsYbloJwQjMeZ8X+jPP9aZf6IeZMWtCAbMmFPC5ZTPZX9/CIxv38fDGfdzx7A5ueWo7heFD/fpLjxs/An+kiIwmBX2mMINJC73l/B/Ajqe8vfzX7vP2+MPFXrfOSR+GYxd7o3rSML4gj0tPm8qlp02lsbWdJ948wEOv7ePR1yu57yWvX396ofFS+ybOmjmOk6cUE8rV3r6InyjoM1FOjtdnP+2d8N6fwNZV8Mof4ZW74IXfQqwCTvyg16c/aaHXSKQhEsrl3fMqePe8iu5+/Yc37uOvL27nvx55k58//Cb5wQCnTi9l8cwyzpo5jhMmFhLIUd++yFimoM90uSE47t3e0trodem8chc89xtY+/+88fjHvdfr15+2GILpjbRJ7tc/M38fp5y2mLXbqnhq8wGe2lLFj1a+DkBRfpAzZpSyeNY4zppZxszxMR3UFRljFPRjSSgCJ17iLU013pWuXrsX1t0Ez1wLufner4DZ53vBXzYz7bcuigS79/YBKuuaeXprFU9uPsCTm6v4y4Z9AEwoyOOsmWWclQj+ySWRvt5WRDKAgn6syi+BhZd7S2sjvPUkvPkQbH4IVj7klSmZfij0py3xGoo0TSgMc9HJk7jo5EkA7Khq5KktB3hySxVrNh/g3pe8a+dOLY2wcGox8ycXs2CKN32DztQVySwKej8IRbxAn32+97hqC2x+xAv9F26DZ2+AQJ7XtTPrPJh1vne1rKPogplaFmFqmXdQ1znHpn1xntpygLVbq1i7tbo7+AM5xnHlBZw8pYj5k4uZP7mI48oLNJxTZBQp6P2obKa3nL4c2pq9vf3ND3t7/H/5trcUT/UCf+a7yG+s9coF05sozcyYU1HAnIoCPrV4OgD76ppZv7OWl3cdZP2uWv73lb3c8exOAPJyc5g3sZAFU4pZkAj/aWVRcnSQV2REKOj9LhiGWed6y3t+BDXbvdDf/AisXwHrbuR0gGe/AAXHeA1A8bFQcuzh9wsnQaD3eXTKC8NcMK+CCxJ9/M45dlQ38lIi/F/eVcuKZ3dy85PbASgI5zJ/srfXf+LEIuZNLGRqaUThLzIMFPTZpmSaN6HaqVdAewvseYmNT/0vcysiULsDat+CHWu9sfuu89DrLOCFffHURCOQaAhKZ3hDPHs0AmbGsWVRji2Ldvfzt3d0snl/nPU7a1mfCP9fP76V9k7vsgWxvFxOOKaQEyYWMm+idzt7QsFIbRkR31LQZ7PcPJh6Ovu2NjF32bLDn+tog7rdUPPWoQagdof3eMujUP/2obKRcd7Zu/M/AhN7H9efG8jh+IpCjq8o5O9O9da1tHewaW+c194+yIY9dWzYU8ed63bS2OpdND0UyOGYKJx+YH1irv5C5h5TSDRPX12RdOl/i6QWCHp7/73Nm9/WDAd3QeUGb9qGdTfDM9dB2SyY/3feGbyl0/v9mLzcACdNLuKkyYcuudjR6dhe1ZAI/oOseXU7D2+s5M51uwCvHZleFmVuYs//uAkFzJwQY0pJPrk66CtyBAW9DEwwDONmecsJF0FTLWy8H9b/Hlb9m7dMOcPby593MURK037rQI4xc3yMmeNjvH/BRFbn72Pp0qXsq2thw56D3Q3A+p21PPjyoV8WwYAxrSzqvXZCtPs9ZoyPap5+yWoKehka+cXexVUWfhxqd3rz9Lz8e3jwK7DyG96lFed/BI57T9qje5KZGRVFYSqKwpw7t7x7/cGmNrbuj7NlfwNb9sfZUhnnzcp6Ht64r7vvH6C8MK87+GdNiHU3BhWFYZ3pK76noJehVzwFlnwF3vnPsPcVL/Bf+SO88SDkFcG8i7zunalnefP6DEJRfpBTppZwytTD5/Bv6+hkR3UjmyvjiQbAawjufWk39c3t3eUioQBTSiJMKc1nckmEySX5TCmNMKUkwuTSfAr1S0B8QEEvw8cMjpnvLedfDdseg5fvPDQ5W+FkOOkSqJh/aBhndPxRncjVm2Agp3sPPplzjv3xlu7g37I/zs7qJnbVNPL0lioaEgeBuxTlB73wT2oMkhuFSEj/hSTz6VsqIyMnADPf5S1/8zN4Y6W3p//UL8ElhWtuftIQTm8c/7j9cdhT5DUG+SWDagjMjAkFYSYUhDlzZtlhzznnqG1sY2dNI7tqmthZnbitaeTNynpWvVFJS3vnYa8ZFwtREGjnzt3PM6k4n0nFXiMwqSSfSSX6RSCZQUEvIy8U9YZjnvQhaG04NGyzaxhnzXbv/s5noPkgJwJs+LH32rzCI0/qio73LrIeHe8N9YyUQeDov9pmRkk0REk0xPzJxUc83/Vr4LBGoLqRV7bu5vW363lk45ENQUE4NxH+iQag2GsAum7LoiEdI5Bhp6CX0RWKwoS53pJKUy3rHr6bd8waf3hjUL3Vm6e/rTH168LFhxqASNnhDUH3uvEQm5B2d1Hyr4GFSccEVq+uZtmyZTjnOBBvZXet1xW0u6aJ3bVN7K5pYldNE2u3VhNvaT/sPcPBHCoKw5R3L3nd9yuKwpQXhJlQmKeJ4mRQFPSS2fKLiRfMgLnLjnzOOWishob93tJ4ABoOQGOVd9uw37tftcX7ddBYdfjZvl2Kp8L0pTBjGUw/2wv/ATAzxhfkMb4gj5OnpP5FUNfUzq7aQ43Arpom9tU1U1nXwks7a9lX13zErwKA4kiQ8oIw5UVhygvyqCgKM6EwTEVhmHGxEONieYyL5ZEfUoMgR1LQy9hlBtEyb+H4/st3dnrz+Hc3CAfg4G5v0reN98OLt3nlJsyDGUu98J+2GPKGZhoGM6MoEqQo4k3nnIpzjoNNbeyra2FfXTN765qprGtmX11L9/039taxv76FpNGj3SKhAGWJ4C+L5jEuFqKhqpVtwW2UxfK6G4WyaIiSSEhzC2UJBb1kj5ycQw3D+DmH1p/5eejsgLfXw9bV3uigdTd5V/DKyYVJiw7t8U8+Na2LtA+UmVEcCVEcCTGnovcGpqPTURX3wr8q3sr+eAtV8Vaq4i0ciLdQ1eB1Ia3fVUtVvI0/bX3tiPfIMSiNeqFfGg1RGgsdup+0lEXzKI2GKIkEdebxGKWgFwFvVFDXxdmXfMWb4mHnM17ob10NT/wUHr8GghGYeqa3xz9jGZSfNCrVDeQYEwq97pv+PLpqFaectpgD8RYOxFupamjhQL3XGBxINBDVDa1sfLuO6oZWahvben2v4kiQ0khSIxDzGqWSSJDi/BBFkSAlkRDFkSDF+UGKIkHyctWdNNoU9CKpBMOJMF8K537Hm+Jh+5pE8D8GD33HK5dfwinBcqia32NY6FQomtLn1M4jJSdpNNHs8v7Lt3d0UtPYRnWD1yhUN3gNQVeD0LW8VdXICztqqW1sPews5J4ioQAlkRBF+UGKEw1BUaIhKImE2LOrjeZX36YwHKQwP0hRfpDCcJCCcK66loaIgl4kHfnFMPdvvQWgbg9sexy2r8FtfbGXqZ1zoGDikQ1A1xTPhZMGNAx0uOUGcroPKkP/xyecczS0dlDb6P0aqG1so7aplZrGNg4m1tU0tnGwybv/+t46DjZ55boaiJtffeGI9zXzpq4uDCfCPz/5fleDkEtBolHouu1qJGLhXF3ZLCHzvmUiY0HhRFhwKSy4lJdWr2bZsmWJqZ33HJrSOfn8gG1PeNM+k7Tn2zXHf0E5RCdAbHxiSGiK++HiITljeDiYGbG8XGJ5uUwu6b98F+cc8ZZ2/rrqCeYueAd1zW0cbGqjrqmNuub2pPuJ26Z2dlQ3dq/veRZzKuFgzmENgdcw5FKQd2hdLJxLLC9ALC9INC9AQTiXaF4u0ZBXtq9fK2OFgl5kqASC3p57ybGpn29vhbpdPU4Q2wENld5JYrue7X0IaE4wMe4/RWMQKYP8Uu+s4UjiNlyckb8WkpkZBeEgZfk5nDCx8Khf39bRSX1zO/XNbdQ3t1OXuE1e133bcmj92webu9c3ptFYAOQ9upJYntcAdDVqse4GIUAklEs0L0B+KEA0lEsksS6Sl/z40LpIMDCiB7Yz+5sg4ie5Ie+KXKUzei/T2ZE4N6AS4pWJ8wFS3K/c6J0n0NHa+3uFiyC/hIXtQdg5NdEI9GgQ8ku9BiNW4Z1IljN2DpwGAzndB4UHqr2jk4bWDuIt7TQkGoOGlnbiiaWhpZ1XXn+T8ROnEO9+roN4Sxv761vYdqCBhpZ2mlo7aGhtTznktTeh3ByioQCfXjydL507e8B/QzoU9CKZJCeQCN7xUD6v77LOQfNBaKpOnB9Qk3Q/cdtUTfuuzd796i3ebfPB1O9nOYfOFo5VQKzcu19QkbQu8TgUHfq/fRTkBnIoys+hKL/3g+ar295i2bJeztxO4pyjpb2TxtYOL/zbvNvG1o7E0k5Di3ebvG52+fBfLlNBLzJWmXkHifOPPAs32ctdxxC6dLRDc22iQajyfiHE9x1a6hO3+zZ4ty5F90YolmgIyr1fB12/Fo741VB66NdDBoxAGk5mRjgYIBwMDOpXxnBQ0Itkm0BuYu6fcUA/XQadnd6vhPq9qRuD+D5violdz3m/Ijp7H4NPqAAiJUc0CDP2VoF7yruGcSDPu80NJ5ZQ4jaxLtDjcW7Y66LK8OMRoy2trWNmpcCNwAXAAeBbzrn/6aN8CFgPFDjnJg9FRUVkFOTkJDUKJ/Zd1jlojSd1HVUndSElreu6X7MdmmqY1NIAO/s41pCO5EnsouMOTV7XdbC6e4K7gc9uOpal+9f+CmgFyoGTgQfNbL1zbkMv5b8O7CedQbgi4g9m3rxAeQXeeQJpemL1apYtXeodWG5vSSzN3m1H0v32Zm/kUvJzbc1ew5E8qd2BzdC4tvcRTJDoWko0BOGiQ/XOK4C8mDcdduJxcc1W2FVweJlQNGOHu6bSb9CbWRS4BDjRORcH1pjZ/cDlwDdTlJ8O/D3wFeDXQ1tdEfEls0R3TN7QvWdnh3dGc3cjsD9pdtPE/YYD3pDXlnpoiXu3HS2Hvc3J4PVPHFbfHK8rKi/mTYsRDHsXzQmGvce5YQjmJ257Pp9/6H5uPoyb7S3DyJzrezyQmZ0CPOmciySt+xqw1Dl3YYryD+B189QAv+ut68bMlgPLAcrLyxetWLFiQH9APB4nFov1X3CUZHr9IPPrqPoNjup3dKyzjdz2JgIdTQQ6GmmrryIWgtz2RgIdTYnbxkSZRgIdLeR0tpLT2Zp0v6XH41ZyUh3UBnZM+SDHNgQEAAAK+0lEQVRbZ35iQHU955xznnfOvaPfgs65PhdgCbC3x7orgdUpyl4MrEzcXwbs6u/9nXMsWrTIDdSqVasG/NqRkOn1cy7z66j6DY7qNzhDVr/2VueaDjpXv8+56u3OVb7u3O4XnKvZMeC3BNa5NDI2nT76ONDztLVCoD55RaKL5xrgfWm8p4hIdgkEE0NMj/4s4MFKJ+g3AblmNts592Zi3QKg54HY2cA04InENTBDQJGZ7QXOcM5tH5Iai4jIUek36J1zDWZ2N3C1mV2Bd2ziIuCsHkVfBaYkPT4L+CWwEG8EjoiIjIJ0Z9X5PJAPVAJ3AJ9zzm0wsyVmFgdwzrU75/Z2LUA10Jl4nN7MQSIiMuTSGkfvnKsGPpBi/RNAysPlzrnVgE6WEhEZZZqVX0TE5xT0IiI+p6AXEfE5Bb2IiM8p6EVEfE5BLyLicwp6ERGfU9CLiPicgl5ExOcU9CIiPqegFxHxOQW9iIjPKehFRHxOQS8i4nMKehERn1PQi4j4nIJeRMTnFPQiIj6noBcR8TkFvYiIzynoRUR8TkEvIuJzCnoREZ9T0IuI+JyCXkTE5xT0IiI+p6AXEfE5Bb2IiM8p6EVEfE5BLyLicwp6ERGfU9CLiPicgl5ExOfSCnozKzWze8yswczeMrOP9VLu62b2qpnVm9k2M/v60FZXRESOVm6a5X4FtALlwMnAg2a23jm3oUc5Az4OvAzMBP5qZjudcyuGqsIiInJ0+t2jN7MocAlwlXMu7pxbA9wPXN6zrHPuGufcC865dufcG8B9wOKhrrSIiKTPnHN9FzA7BXjSORdJWvc1YKlz7sI+XmfAC8D1zrnrUjy/HFgOUF5evmjFioHt9MfjcWKx2IBeOxIyvX6Q+XVU/QZH9RucTK7fOeec87xz7h39FnTO9bkAS4C9PdZdCazu53XfB9YDef19xqJFi9xArVq1asCvHQmZXj/nMr+Oqt/gqH6Dk8n1A9a5fvLVOZdWH30cKOyxrhCo7+0FZvZFvL76Jc65ljQ+Q0REhkk6o242AblmNjtp3QKg54FYAMzs08A3gXOdc7sGX0URERmMfoPeOdcA3A1cbWZRM1sMXATc1rOsmV0G/DtwvnNu61BXVkREjl66J0x9HsgHKoE7gM855zaY2RIziyeV+yFQBjxnZvHEcsSBWBERGTlpjaN3zlUDH0ix/gkglvR4+tBVTUREhoKmQBAR8TkFvYiIzynoRUR8TkEvIuJzCnoREZ9T0IuI+JyCXkTE5xT0IiI+p6AXEfE5Bb2IiM8p6EVEfE5BLyLicwp6ERGfU9CLiPicgl5ExOcU9CIiPqegFxHxOQW9iIjPKehFRHxOQS8i4nMKehERn1PQi4j4nIJeRMTnFPQiIj6noBcR8TkFvYiIzynoRUR8TkEvIuJzCnoREZ9T0IuI+JyCXkTE5xT0IiI+p6AXEfE5Bb2IiM+lFfRmVmpm95hZg5m9ZWYf66WcmdmPzawqsfzYzGxoqywiIkcjN81yvwJagXLgZOBBM1vvnNvQo9xy4APAAsABDwHbgOuGproiInK0+t2jN7MocAlwlXMu7pxbA9wPXJ6i+CeAnznndjnndgM/Az45hPUVEZGjlM4e/XFAu3NuU9K69cDSFGXnJZ5LLjcv1Zua2XK8XwAAcTN7I426pDIOODDA146ETK8fZH4dVb/BUf0GJ5Prd2w6hdIJ+hhQ12PdQaCgl7IHe5SLmZk551xyQefcDcAN6VSyL2a2zjn3jsG+z3DJ9PpB5tdR9Rsc1W9wMr1+6UjnYGwcKOyxrhCoT6NsIRDvGfIiIjJy0gn6TUCumc1OWrcA6HkglsS6BWmUExGREdJv0DvnGoC7gavNLGpmi4GLgNtSFP8t8BUzm2RmE4GvArcMYX1TGXT3zzDL9PpB5tdR9Rsc1W9wMr1+/bJ0elXMrBS4CTgfqAK+6Zz7HzNbAqx0zsUS5Qz4MXBF4qW/Ab6hrhsRkdGTVtCLiMjYpSkQRER8TkEvIuJzYyLoM3muHTPLM7MbE/WqN7OXzOy9vZT9pJl1mFk8aVk2nPVLfO5qM2tO+syUJ6eN0vaL91g6zOwXvZQdke1nZl80s3Vm1mJmt/R47lwze93MGs1slZn1esKKmU1LlGlMvOa84ayfmZ1hZg+ZWbWZ7TezP5jZMX28T1rfiyGs3zQzcz3+/a7q431Gevtd1qNujYn6LurlfYZl+w2HMRH0HD7XzmXAtWaW6ozb5Ll25gMXAp8d5rrlAjvxzhQuAv4VuNPMpvVS/mnnXCxpWT3M9evyxaTPnNNLmRHffsnbAqgAmoA/9PGSkdh+e4Af4g1A6GZm4/BGoF0FlALrgN/38T53AC8CZcC/AH80s/HDVT+gBG+EyDS8MybrgZv7ea90vhdDVb8uxUmf+YM+3mdEt59z7vYe38fPA1uBF/p4r+HYfkMu44PeMnyuHedcg3Pue8657c65TufcA3gTuaXcC8hwoz1X0SVAJfDECH7mEZxzdzvn7sUbYZbsg8AG59wfnHPNwPeABWZ2fM/3MLPjgIXAd51zTc65u4BX8P7GYamfc25lom51zrlG4JfA4sF+3lDV72iMxvZL4RPAb/0wajDjg57e59pJtUef9lw7w8XMyvHq3NuJYqeY2QEz22RmV5lZujOIDtaPEp/7ZB/dHaO9/dL5jzVa2w96bJ/EOSZb6P27uNU5l3wG+Uhvz7Pp/4TFdL4XQ+0tM9tlZjcnfiWlMqrbL9EldzbeuUF9GY3td9TGQtAPyVw7w1S3w5hZELgduNU593qKIo8DJwIT8PZMPgp8fQSq9g1gBjAJ76f9n8xsZopyo7b9Ev+xlgK39lFstLZfl57bB9L/LvZVdsiZ2XzgO/S9fdL9XgyVA8CpeN1Ki/C2xe29lB3V7Qd8HHjCObetjzIjvf0GbCwE/ZiYa8fMcvDOFm4FvpiqjHNuq3NuW6KL5xXgauBDw10359wzzrl651yLc+5W4EngfSmKjuZcRZcDa/r6jzVa2y/JYL6LfZUdUmY2C1gJfNk512s32FF8L4ZEout1nXOu3Tm3D+//yQVmliq8R237JXycvnc6Rnz7DcZYCPqMn2snscd7I97B4kucc21pvtQBo3EFrt4+dzTnKur3P1YKI739Dts+ieNHM+n9uzijR4gN+/ZM/DJ6GPiBcy7VNCV9Gent2bUDkSqHRmX7AZg3zctE4I9H+dLR+v/cr4wP+jEw1w7AtcBc4ELnXFNvhczsvYk+fBIH8K4C7hvOiplZsZm928zCZpZrZpfh9T3+OUXxUdl+ZnYW3s/fvkbbjNj2S2ynMBAAAl3bDrgHONHMLkk8/x3g5VTddIljSi8B3028/mK8kUx3DVf9zGwS8CjwS+dcn1d1O8rvxVDV73Qzm2NmOWZWBvw3sNo517OLZlS2X1KRTwB39Tg+0PM9hm37DQvnXMYveEPZ7gUagB3AxxLrl+B1LXSVM+AaoDqxXENimodhrNuxeC15M97Pza7lMmBq4v7URNmfAvsSf8dWvK6H4DDXbzzwHN5P3lpgLXB+pmy/xOdeD9yWYv2obD+80TSux/K9xHPnAa/jDQNdDUxLet11wHVJj6clyjQBbwDnDWf9gO8m7id/D5P/fb+NNzdVn9+LYazfR/FGpDUAb+PtWFRkyvZLPBdObI9zU7xuRLbfcCya60ZExOcyvutGREQGR0EvIuJzCnoREZ9T0IuI+JyCXkTE5xT0IiI+p6AXEfE5Bb2IiM/9fxa1TMRPJlw0AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(pd.DataFrame(history.history))\n",
    "plt.grid(True)\n",
    "plt.gca().set_ylim(0, 1)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.38745382],\n",
       "       [1.6820507 ],\n",
       "       [3.0960472 ]], dtype=float32)"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pred"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Functional API"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Not all neural network models are simply sequential. Some may have complex topologies. Some may have multiple inputs and/or multiple outputs. For example, a Wide & Deep neural network (see [paper](https://ai.google/research/pubs/pub45413)) connects all or part of the inputs directly to the output layer."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(42)\n",
    "tf.random.set_seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [],
   "source": [
    "input = keras.layers.Input(shape=X_train.shape[1:])\n",
    "hidden1 = keras.layers.Dense(30, activation=\"relu\")(input)\n",
    "hidden2 = keras.layers.Dense(30, activation=\"relu\")(hidden1)\n",
    "concat = keras.layers.concatenate([input, hidden2])\n",
    "output = keras.layers.Dense(1)(concat)\n",
    "model = keras.models.Model(inputs=[input], outputs=[output])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "__________________________________________________________________________________________________\n",
      "Layer (type)                    Output Shape         Param #     Connected to                     \n",
      "==================================================================================================\n",
      "input_1 (InputLayer)            [(None, 8)]          0                                            \n",
      "__________________________________________________________________________________________________\n",
      "dense_8 (Dense)                 (None, 30)           270         input_1[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "dense_9 (Dense)                 (None, 30)           930         dense_8[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "concatenate (Concatenate)       (None, 38)           0           input_1[0][0]                    \n",
      "                                                                 dense_9[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "dense_10 (Dense)                (None, 1)            39          concatenate[0][0]                \n",
      "==================================================================================================\n",
      "Total params: 1,239\n",
      "Trainable params: 1,239\n",
      "Non-trainable params: 0\n",
      "__________________________________________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 11610 samples, validate on 3870 samples\n",
      "Epoch 1/20\n",
      "11610/11610==============================] - 1s 50us/sample - loss: 1.2544 - val_loss: 2.9415\n",
      "Epoch 2/20\n",
      "11610/11610==============================] - 0s 32us/sample - loss: 0.6531 - val_loss: 0.8754\n",
      "Epoch 3/20\n",
      "11610/11610==============================] - 0s 32us/sample - loss: 0.5873 - val_loss: 0.5529\n",
      "Epoch 4/20\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.5574 - val_loss: 0.5205\n",
      "Epoch 5/20\n",
      "11610/11610==============================] - 0s 36us/sample - loss: 0.5343 - val_loss: 0.5399\n",
      "Epoch 6/20\n",
      "11610/11610==============================] - 0s 34us/sample - loss: 0.5160 - val_loss: 0.4793\n",
      "Epoch 7/20\n",
      "11610/11610==============================] - 0s 32us/sample - loss: 0.5004 - val_loss: 0.4655\n",
      "Epoch 8/20\n",
      "11610/11610==============================] - 0s 33us/sample - loss: 0.4873 - val_loss: 0.4820\n",
      "Epoch 9/20\n",
      "11610/11610==============================] - 0s 32us/sample - loss: 0.4761 - val_loss: 0.4421\n",
      "Epoch 10/20\n",
      "11610/11610==============================] - 0s 32us/sample - loss: 0.4658 - val_loss: 0.4321\n",
      "Epoch 11/20\n",
      "11610/11610==============================] - 0s 32us/sample - loss: 0.4577 - val_loss: 0.4526\n",
      "Epoch 12/20\n",
      "11610/11610==============================] - 0s 32us/sample - loss: 0.4499 - val_loss: 0.4178\n",
      "Epoch 13/20\n",
      "11610/11610==============================] - 0s 32us/sample - loss: 0.4428 - val_loss: 0.4162\n",
      "Epoch 14/20\n",
      "11610/11610==============================] - 0s 33us/sample - loss: 0.4367 - val_loss: 0.4185\n",
      "Epoch 15/20\n",
      "11610/11610==============================] - 0s 34us/sample - loss: 0.4311 - val_loss: 0.3991\n",
      "Epoch 16/20\n",
      "11610/11610==============================] - 0s 34us/sample - loss: 0.4259 - val_loss: 0.3998\n",
      "Epoch 17/20\n",
      "11610/11610==============================] - 0s 33us/sample - loss: 0.4210 - val_loss: 0.3896\n",
      "Epoch 18/20\n",
      "11610/11610==============================] - 0s 34us/sample - loss: 0.4165 - val_loss: 0.3864\n",
      "Epoch 19/20\n",
      "11610/11610==============================] - 0s 33us/sample - loss: 0.4123 - val_loss: 0.3819\n",
      "Epoch 20/20\n",
      "11610/11610==============================] - 0s 32us/sample - loss: 0.4087 - val_loss: 0.3878\n",
      "5160/5160==============================] - 0s 14us/sample - loss: 0.4029\n"
     ]
    }
   ],
   "source": [
    "model.compile(loss=\"mean_squared_error\", optimizer=\"sgd\")\n",
    "history = model.fit(X_train, y_train, epochs=20,\n",
    "                    validation_data=(X_valid, y_valid))\n",
    "mse_test = model.evaluate(X_test, y_test)\n",
    "y_pred = model.predict(X_new)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "What if you want to send different subsets of input features through the wide or deep paths? We will send 5 features (features 0 to 4), and 6 through the deep path (features 2 to 7). Note that 3 features will go through both (features 2, 3 and 4)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(42)\n",
    "tf.random.set_seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [],
   "source": [
    "input_A = keras.layers.Input(shape=[5])\n",
    "input_B = keras.layers.Input(shape=[6])\n",
    "hidden1 = keras.layers.Dense(30, activation=\"relu\")(input_B)\n",
    "hidden2 = keras.layers.Dense(30, activation=\"relu\")(hidden1)\n",
    "concat = keras.layers.concatenate([input_A, hidden2])\n",
    "output = keras.layers.Dense(1)(concat)\n",
    "model = keras.models.Model(inputs=[input_A, input_B], outputs=[output])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 11610 samples, validate on 3870 samples\n",
      "Epoch 1/20\n",
      "11610/11610==============================] - 1s 53us/sample - loss: 1.8070 - val_loss: 0.8422\n",
      "Epoch 2/20\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.6752 - val_loss: 0.6426\n",
      "Epoch 3/20\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.5969 - val_loss: 0.5829\n",
      "Epoch 4/20\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.5580 - val_loss: 0.5259\n",
      "Epoch 5/20\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.5317 - val_loss: 0.5005\n",
      "Epoch 6/20\n",
      "11610/11610==============================] - 0s 34us/sample - loss: 0.5125 - val_loss: 0.4792\n",
      "Epoch 7/20\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.4963 - val_loss: 0.4786\n",
      "Epoch 8/20\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.4840 - val_loss: 0.4562\n",
      "Epoch 9/20\n",
      "11610/11610==============================] - 0s 34us/sample - loss: 0.4733 - val_loss: 0.4407\n",
      "Epoch 10/20\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.4640 - val_loss: 0.4320\n",
      "Epoch 11/20\n",
      "11610/11610==============================] - 0s 38us/sample - loss: 0.4576 - val_loss: 0.4286\n",
      "Epoch 12/20\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.4516 - val_loss: 0.4226\n",
      "Epoch 13/20\n",
      "11610/11610==============================] - 0s 34us/sample - loss: 0.4463 - val_loss: 0.4263\n",
      "Epoch 14/20\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.4428 - val_loss: 0.4102\n",
      "Epoch 15/20\n",
      "11610/11610==============================] - 0s 34us/sample - loss: 0.4392 - val_loss: 0.4039\n",
      "Epoch 16/20\n",
      "11610/11610==============================] - 0s 36us/sample - loss: 0.4352 - val_loss: 0.4021\n",
      "Epoch 17/20\n",
      "11610/11610==============================] - 0s 37us/sample - loss: 0.4329 - val_loss: 0.4035\n",
      "Epoch 18/20\n",
      "11610/11610==============================] - 0s 36us/sample - loss: 0.4307 - val_loss: 0.3951\n",
      "Epoch 19/20\n",
      "11610/11610==============================] - 0s 37us/sample - loss: 0.4275 - val_loss: 0.3932\n",
      "Epoch 20/20\n",
      "11610/11610==============================] - 0s 37us/sample - loss: 0.4264 - val_loss: 0.4000\n",
      "5160/5160==============================] - 0s 15us/sample - loss: 0.4204\n"
     ]
    }
   ],
   "source": [
    "model.compile(loss=\"mse\", optimizer=\"sgd\")\n",
    "\n",
    "X_train_A, X_train_B = X_train[:, :5], X_train[:, 2:]\n",
    "X_valid_A, X_valid_B = X_valid[:, :5], X_valid[:, 2:]\n",
    "X_test_A, X_test_B = X_test[:, :5], X_test[:, 2:]\n",
    "X_new_A, X_new_B = X_test_A[:3], X_test_B[:3]\n",
    "\n",
    "history = model.fit((X_train_A, X_train_B), y_train, epochs=20,\n",
    "                    validation_data=((X_valid_A, X_valid_B), y_valid))\n",
    "mse_test = model.evaluate((X_test_A, X_test_B), y_test)\n",
    "y_pred = model.predict((X_new_A, X_new_B))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Adding an auxiliary output for regularization:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(42)\n",
    "tf.random.set_seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [],
   "source": [
    "input_A = keras.layers.Input(shape=[5])\n",
    "input_B = keras.layers.Input(shape=[6])\n",
    "hidden1 = keras.layers.Dense(30, activation=\"relu\")(input_B)\n",
    "hidden2 = keras.layers.Dense(30, activation=\"relu\")(hidden1)\n",
    "concat = keras.layers.concatenate([input_A, hidden2])\n",
    "output = keras.layers.Dense(1)(concat)\n",
    "aux_output = keras.layers.Dense(1)(hidden2)\n",
    "model = keras.models.Model(inputs=[input_A, input_B],\n",
    "                           outputs=[output, aux_output])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.compile(loss=[\"mse\", \"mse\"], loss_weights=[0.9, 0.1], optimizer=\"sgd\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 11610 samples, validate on 3870 samples\n",
      "Epoch 1/20\n",
      "11610/11610==============================] - 1s 83us/sample - loss: 2.1325 - dense_16_loss: 1.9139 - dense_17_loss: 4.0950 - val_loss: 1.6650 - val_dense_16_loss: 0.8892 - val_dense_17_loss: 8.6440\n",
      "Epoch 2/20\n",
      "11610/11610==============================] - 1s 47us/sample - loss: 0.8870 - dense_16_loss: 0.6930 - dense_17_loss: 2.6303 - val_loss: 1.4991 - val_dense_16_loss: 0.6627 - val_dense_17_loss: 9.0235\n",
      "Epoch 3/20\n",
      "11610/11610==============================] - 1s 49us/sample - loss: 0.7421 - dense_16_loss: 0.6079 - dense_17_loss: 1.9515 - val_loss: 1.4340 - val_dense_16_loss: 0.5748 - val_dense_17_loss: 9.1628\n",
      "Epoch 4/20\n",
      "11610/11610==============================] - 1s 44us/sample - loss: 0.6766 - dense_16_loss: 0.5683 - dense_17_loss: 1.6515 - val_loss: 1.3260 - val_dense_16_loss: 0.5579 - val_dense_17_loss: 8.2343\n",
      "Epoch 5/20\n",
      "11610/11610==============================] - 1s 45us/sample - loss: 0.6366 - dense_16_loss: 0.5422 - dense_17_loss: 1.4873 - val_loss: 1.2081 - val_dense_16_loss: 0.5184 - val_dense_17_loss: 7.4115\n",
      "Epoch 6/20\n",
      "11610/11610==============================] - 1s 48us/sample - loss: 0.6082 - dense_16_loss: 0.5209 - dense_17_loss: 1.3933 - val_loss: 1.0861 - val_dense_16_loss: 0.5113 - val_dense_17_loss: 6.2558\n",
      "Epoch 7/20\n",
      "11610/11610==============================] - 1s 48us/sample - loss: 0.5849 - dense_16_loss: 0.5034 - dense_17_loss: 1.3185 - val_loss: 0.9914 - val_dense_16_loss: 0.5227 - val_dense_17_loss: 5.2070\n",
      "Epoch 8/20\n",
      "11610/11610==============================] - 0s 43us/sample - loss: 0.5664 - dense_16_loss: 0.4897 - dense_17_loss: 1.2556 - val_loss: 0.8656 - val_dense_16_loss: 0.4650 - val_dense_17_loss: 4.4682\n",
      "Epoch 9/20\n",
      "11610/11610==============================] - 1s 44us/sample - loss: 0.5506 - dense_16_loss: 0.4770 - dense_17_loss: 1.2125 - val_loss: 0.7778 - val_dense_16_loss: 0.4563 - val_dense_17_loss: 3.6704\n",
      "Epoch 10/20\n",
      "11610/11610==============================] - 0s 43us/sample - loss: 0.5371 - dense_16_loss: 0.4668 - dense_17_loss: 1.1711 - val_loss: 0.7089 - val_dense_16_loss: 0.4513 - val_dense_17_loss: 3.0250\n",
      "Epoch 11/20\n",
      "11610/11610==============================] - 1s 44us/sample - loss: 0.5268 - dense_16_loss: 0.4593 - dense_17_loss: 1.1340 - val_loss: 0.6476 - val_dense_16_loss: 0.4292 - val_dense_17_loss: 2.6140\n",
      "Epoch 12/20\n",
      "11610/11610==============================] - 1s 44us/sample - loss: 0.5176 - dense_16_loss: 0.4524 - dense_17_loss: 1.1035 - val_loss: 0.6025 - val_dense_16_loss: 0.4200 - val_dense_17_loss: 2.2451\n",
      "Epoch 13/20\n",
      "11610/11610==============================] - 1s 44us/sample - loss: 0.5095 - dense_16_loss: 0.4463 - dense_17_loss: 1.0766 - val_loss: 0.5692 - val_dense_16_loss: 0.4158 - val_dense_17_loss: 1.9492\n",
      "Epoch 14/20\n",
      "11610/11610==============================] - 1s 48us/sample - loss: 0.5031 - dense_16_loss: 0.4420 - dense_17_loss: 1.0529 - val_loss: 0.5362 - val_dense_16_loss: 0.4092 - val_dense_17_loss: 1.6791\n",
      "Epoch 15/20\n",
      "11610/11610==============================] - 1s 48us/sample - loss: 0.4972 - dense_16_loss: 0.4381 - dense_17_loss: 1.0284 - val_loss: 0.5120 - val_dense_16_loss: 0.4053 - val_dense_17_loss: 1.4733\n",
      "Epoch 16/20\n",
      "11610/11610==============================] - 1s 43us/sample - loss: 0.4915 - dense_16_loss: 0.4341 - dense_17_loss: 1.0078 - val_loss: 0.4935 - val_dense_16_loss: 0.4013 - val_dense_17_loss: 1.3245\n",
      "Epoch 17/20\n",
      "11610/11610==============================] - 0s 43us/sample - loss: 0.4871 - dense_16_loss: 0.4314 - dense_17_loss: 0.9878 - val_loss: 0.4797 - val_dense_16_loss: 0.3979 - val_dense_17_loss: 1.2147\n",
      "Epoch 18/20\n",
      "11610/11610==============================] - 0s 43us/sample - loss: 0.4830 - dense_16_loss: 0.4290 - dense_17_loss: 0.9694 - val_loss: 0.4669 - val_dense_16_loss: 0.3954 - val_dense_17_loss: 1.1119\n",
      "Epoch 19/20\n",
      "11610/11610==============================] - 0s 43us/sample - loss: 0.4787 - dense_16_loss: 0.4262 - dense_17_loss: 0.9513 - val_loss: 0.4577 - val_dense_16_loss: 0.3930 - val_dense_17_loss: 1.0410\n",
      "Epoch 20/20\n",
      "11610/11610==============================] - 1s 44us/sample - loss: 0.4758 - dense_16_loss: 0.4249 - dense_17_loss: 0.9342 - val_loss: 0.4558 - val_dense_16_loss: 0.3952 - val_dense_17_loss: 1.0002\n"
     ]
    }
   ],
   "source": [
    "history = model.fit([X_train_A, X_train_B], [y_train, y_train], epochs=20,\n",
    "                    validation_data=([X_valid_A, X_valid_B], [y_valid, y_valid]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5160/5160==============================] - 0s 22us/sample - loss: 0.4661 - dense_16_loss: 0.4167 - dense_17_loss: 0.9138\n"
     ]
    }
   ],
   "source": [
    "total_loss, main_loss, aux_loss = model.evaluate(\n",
    "    [X_test_A, X_test_B], [y_test, y_test])\n",
    "y_pred_main, y_pred_aux = model.predict([X_new_A, X_new_B])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# The subclassing API"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [],
   "source": [
    "class WideAndDeepModel(keras.models.Model):\n",
    "    def __init__(self, units=30, activation=\"relu\", **kwargs):\n",
    "        super().__init__(**kwargs)\n",
    "        self.hidden1 = keras.layers.Dense(units, activation=activation)\n",
    "        self.hidden2 = keras.layers.Dense(units, activation=activation)\n",
    "        self.main_output = keras.layers.Dense(1)\n",
    "        self.aux_output = keras.layers.Dense(1)\n",
    "        \n",
    "    def call(self, inputs):\n",
    "        input_A, input_B = inputs\n",
    "        hidden1 = self.hidden1(input_B)\n",
    "        hidden2 = self.hidden2(hidden1)\n",
    "        concat = keras.layers.concatenate([input_A, hidden2])\n",
    "        main_output = self.main_output(concat)\n",
    "        aux_output = self.aux_output(hidden2)\n",
    "        return main_output, aux_output\n",
    "\n",
    "model = WideAndDeepModel(30, activation=\"relu\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 11610 samples, validate on 3870 samples\n",
      "Epoch 1/10\n",
      "11610/11610==============================] - 1s 81us/sample - loss: 2.2914 - output_1_loss: 2.1790 - output_2_loss: 3.2954 - val_loss: 2.7823 - val_output_1_loss: 2.0246 - val_output_2_loss: 9.5935\n",
      "Epoch 2/10\n",
      "11610/11610==============================] - 1s 44us/sample - loss: 0.9834 - output_1_loss: 0.8678 - output_2_loss: 2.0207 - val_loss: 1.6646 - val_output_1_loss: 0.7720 - val_output_2_loss: 9.6934\n",
      "Epoch 3/10\n",
      "11610/11610==============================] - 1s 44us/sample - loss: 0.8264 - output_1_loss: 0.7295 - output_2_loss: 1.6967 - val_loss: 1.4471 - val_output_1_loss: 0.6947 - val_output_2_loss: 8.2170\n",
      "Epoch 4/10\n",
      "11610/11610==============================] - 1s 44us/sample - loss: 0.7616 - output_1_loss: 0.6750 - output_2_loss: 1.5418 - val_loss: 1.2658 - val_output_1_loss: 0.6379 - val_output_2_loss: 6.9130\n",
      "Epoch 5/10\n",
      "11610/11610==============================] - 1s 43us/sample - loss: 0.7203 - output_1_loss: 0.6400 - output_2_loss: 1.4425 - val_loss: 1.1078 - val_output_1_loss: 0.6015 - val_output_2_loss: 5.6652\n",
      "Epoch 6/10\n",
      "11610/11610==============================] - 1s 45us/sample - loss: 0.6889 - output_1_loss: 0.6124 - output_2_loss: 1.3768 - val_loss: 0.9780 - val_output_1_loss: 0.5691 - val_output_2_loss: 4.8158\n",
      "Epoch 7/10\n",
      "11610/11610==============================] - 0s 43us/sample - loss: 0.6620 - output_1_loss: 0.5885 - output_2_loss: 1.3240 - val_loss: 0.8896 - val_output_1_loss: 0.5852 - val_output_2_loss: 3.6278\n",
      "Epoch 8/10\n",
      "11610/11610==============================] - 1s 44us/sample - loss: 0.6402 - output_1_loss: 0.5697 - output_2_loss: 1.2749 - val_loss: 0.7913 - val_output_1_loss: 0.5294 - val_output_2_loss: 3.1492\n",
      "Epoch 9/10\n",
      "11610/11610==============================] - 1s 46us/sample - loss: 0.6200 - output_1_loss: 0.5513 - output_2_loss: 1.2377 - val_loss: 0.7284 - val_output_1_loss: 0.5119 - val_output_2_loss: 2.6768\n",
      "Epoch 10/10\n",
      "11610/11610==============================] - 1s 46us/sample - loss: 0.6020 - output_1_loss: 0.5353 - output_2_loss: 1.2002 - val_loss: 0.6832 - val_output_1_loss: 0.4927 - val_output_2_loss: 2.3969\n",
      "5160/5160==============================] - 0s 21us/sample - loss: 0.5847 - output_1_loss: 0.5204 - output_2_loss: 1.1756\n"
     ]
    }
   ],
   "source": [
    "model.compile(loss=\"mse\", loss_weights=[0.9, 0.1], optimizer=\"sgd\")\n",
    "history = model.fit((X_train_A, X_train_B), (y_train, y_train), epochs=10,\n",
    "                    validation_data=((X_valid_A, X_valid_B), (y_valid, y_valid)))\n",
    "total_loss, main_loss, aux_loss = model.evaluate((X_test_A, X_test_B), (y_test, y_test))\n",
    "y_pred_main, y_pred_aux = model.predict((X_new_A, X_new_B))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = WideAndDeepModel(30, activation=\"relu\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Saving and Restoring"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(42)\n",
    "tf.random.set_seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = keras.models.Sequential([\n",
    "    keras.layers.Dense(30, activation=\"relu\", input_shape=[8]),\n",
    "    keras.layers.Dense(30, activation=\"relu\"),\n",
    "    keras.layers.Dense(1)\n",
    "])    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 11610 samples, validate on 3870 samples\n",
      "Epoch 1/10\n",
      "11610/11610==============================] - 1s 64us/sample - loss: 1.8807 - val_loss: 0.7701\n",
      "Epoch 2/10\n",
      "11610/11610==============================] - 0s 34us/sample - loss: 0.6570 - val_loss: 0.7268\n",
      "Epoch 3/10\n",
      "11610/11610==============================] - 0s 34us/sample - loss: 0.5932 - val_loss: 0.6569\n",
      "Epoch 4/10\n",
      "11610/11610==============================] - 0s 34us/sample - loss: 0.5547 - val_loss: 0.5244\n",
      "Epoch 5/10\n",
      "11610/11610==============================] - 0s 33us/sample - loss: 0.5269 - val_loss: 0.5068\n",
      "Epoch 6/10\n",
      "11610/11610==============================] - 0s 36us/sample - loss: 0.5035 - val_loss: 0.5028\n",
      "Epoch 7/10\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.4852 - val_loss: 0.4924\n",
      "Epoch 8/10\n",
      "11610/11610==============================] - 0s 37us/sample - loss: 0.4709 - val_loss: 0.4534\n",
      "Epoch 9/10\n",
      "11610/11610==============================] - 0s 33us/sample - loss: 0.4578 - val_loss: 0.4403\n",
      "Epoch 10/10\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.4473 - val_loss: 0.4496\n",
      "5160/5160==============================] - 0s 15us/sample - loss: 0.4379\n"
     ]
    }
   ],
   "source": [
    "model.compile(loss=\"mse\", optimizer=\"sgd\")\n",
    "history = model.fit(X_train, y_train, epochs=10, validation_data=(X_valid, y_valid))\n",
    "mse_test = model.evaluate(X_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.save(\"my_keras_model.h5\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = keras.models.load_model(\"my_keras_model.h5\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.54925185],\n",
       "       [1.6747888 ],\n",
       "       [3.0483947 ]], dtype=float32)"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.predict(X_new)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.save_weights(\"my_keras_weights.ckpt\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<tensorflow.python.training.checkpointable.util.CheckpointLoadStatus at 0x13a73f860>"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.load_weights(\"my_keras_weights.ckpt\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Using Callbacks during Training"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(42)\n",
    "tf.random.set_seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = keras.models.Sequential([\n",
    "    keras.layers.Dense(30, activation=\"relu\", input_shape=[8]),\n",
    "    keras.layers.Dense(30, activation=\"relu\"),\n",
    "    keras.layers.Dense(1)\n",
    "])    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 11610 samples, validate on 3870 samples\n",
      "Epoch 1/10\n",
      "11610/11610==============================] - 1s 71us/sample - loss: 1.8807 - val_loss: 0.7701\n",
      "Epoch 2/10\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.6570 - val_loss: 0.7268\n",
      "Epoch 3/10\n",
      "11610/11610==============================] - 0s 36us/sample - loss: 0.5932 - val_loss: 0.6569\n",
      "Epoch 4/10\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.5547 - val_loss: 0.5244\n",
      "Epoch 5/10\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.5269 - val_loss: 0.5068\n",
      "Epoch 6/10\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.5035 - val_loss: 0.5028\n",
      "Epoch 7/10\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.4852 - val_loss: 0.4924\n",
      "Epoch 8/10\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.4709 - val_loss: 0.4534\n",
      "Epoch 9/10\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.4578 - val_loss: 0.4403\n",
      "Epoch 10/10\n",
      "11610/11610==============================] - 0s 34us/sample - loss: 0.4473 - val_loss: 0.4496\n",
      "5160/5160==============================] - 0s 45us/sample - loss: 0.4468\n"
     ]
    }
   ],
   "source": [
    "model.compile(loss=\"mse\", optimizer=\"sgd\")\n",
    "checkpoint_cb = keras.callbacks.ModelCheckpoint(\"my_keras_model.h5\", save_best_only=True)\n",
    "history = model.fit(X_train, y_train, epochs=10,\n",
    "                    validation_data=(X_valid, y_valid),\n",
    "                    callbacks=[checkpoint_cb])\n",
    "model = keras.models.load_model(\"my_keras_model.h5\") # rollback to best model\n",
    "mse_test = model.evaluate(X_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 11610 samples, validate on 3870 samples\n",
      "Epoch 1/100\n",
      "11610/11610==============================] - 1s 72us/sample - loss: 0.4483 - val_loss: 0.4280\n",
      "Epoch 2/100\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.4393 - val_loss: 0.4106\n",
      "Epoch 3/100\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.4319 - val_loss: 0.4078\n",
      "Epoch 4/100\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.4262 - val_loss: 0.4037\n",
      "Epoch 5/100\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.4205 - val_loss: 0.3956\n",
      "Epoch 6/100\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.4160 - val_loss: 0.3894\n",
      "Epoch 7/100\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.4116 - val_loss: 0.3891\n",
      "Epoch 8/100\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.4077 - val_loss: 0.3817\n",
      "Epoch 9/100\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.4041 - val_loss: 0.3783\n",
      "Epoch 10/100\n",
      "11610/11610==============================] - 0s 36us/sample - loss: 0.4010 - val_loss: 0.3757\n",
      "Epoch 11/100\n",
      "11610/11610==============================] - 0s 37us/sample - loss: 0.3980 - val_loss: 0.3731\n",
      "Epoch 12/100\n",
      "11610/11610==============================] - 0s 36us/sample - loss: 0.3951 - val_loss: 0.3742\n",
      "Epoch 13/100\n",
      "11610/11610==============================] - 0s 39us/sample - loss: 0.3924 - val_loss: 0.3685\n",
      "Epoch 14/100\n",
      "11610/11610==============================] - 0s 40us/sample - loss: 0.3898 - val_loss: 0.3677\n",
      "Epoch 15/100\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.3873 - val_loss: 0.3626\n",
      "Epoch 16/100\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.3850 - val_loss: 0.3612\n",
      "Epoch 17/100\n",
      "11610/11610==============================] - 0s 38us/sample - loss: 0.3831 - val_loss: 0.3583\n",
      "<<48 more lines>>\n",
      "Epoch 42/100\n",
      "11610/11610==============================] - 0s 37us/sample - loss: 0.3513 - val_loss: 0.3832\n",
      "Epoch 43/100\n",
      "11610/11610==============================] - 0s 40us/sample - loss: 0.3509 - val_loss: 0.3367\n",
      "Epoch 44/100\n",
      "11610/11610==============================] - 0s 40us/sample - loss: 0.3499 - val_loss: 0.3489\n",
      "Epoch 45/100\n",
      "11610/11610==============================] - 0s 37us/sample - loss: 0.3493 - val_loss: 0.3410\n",
      "Epoch 46/100\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.3486 - val_loss: 0.3290\n",
      "Epoch 47/100\n",
      "11610/11610==============================] - 0s 34us/sample - loss: 0.3480 - val_loss: 0.3921\n",
      "Epoch 48/100\n",
      "11610/11610==============================] - 0s 36us/sample - loss: 0.3474 - val_loss: 0.3278\n",
      "Epoch 49/100\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.3467 - val_loss: 0.3842\n",
      "Epoch 50/100\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.3464 - val_loss: 0.3370\n",
      "Epoch 51/100\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.3458 - val_loss: 0.3441\n",
      "Epoch 52/100\n",
      "11610/11610==============================] - 0s 38us/sample - loss: 0.3451 - val_loss: 0.3427\n",
      "Epoch 53/100\n",
      "11610/11610==============================] - 0s 39us/sample - loss: 0.3445 - val_loss: 0.3459\n",
      "Epoch 54/100\n",
      "11610/11610==============================] - 0s 36us/sample - loss: 0.3441 - val_loss: 0.3379\n",
      "Epoch 55/100\n",
      "11610/11610==============================] - 0s 38us/sample - loss: 0.3436 - val_loss: 0.3432\n",
      "Epoch 56/100\n",
      "11610/11610==============================] - 0s 38us/sample - loss: 0.3433 - val_loss: 0.3414\n",
      "Epoch 57/100\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.3427 - val_loss: 0.3347\n",
      "Epoch 58/100\n",
      "11610/11610==============================] - 0s 34us/sample - loss: 0.3421 - val_loss: 0.3485\n",
      "5160/5160==============================] - 0s 15us/sample - loss: 0.3466\n"
     ]
    }
   ],
   "source": [
    "model.compile(loss=\"mse\", optimizer=\"sgd\")\n",
    "early_stopping_cb = keras.callbacks.EarlyStopping(patience=10,\n",
    "                                                  restore_best_weights=True)\n",
    "history = model.fit(X_train, y_train, epochs=100,\n",
    "                    validation_data=(X_valid, y_valid),\n",
    "                    callbacks=[checkpoint_cb, early_stopping_cb])\n",
    "mse_test = model.evaluate(X_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [],
   "source": [
    "class PrintValTrainRatioCallback(keras.callbacks.Callback):\n",
    "    def on_epoch_end(self, epoch, logs):\n",
    "        print(\"\\nval/train: {:.2f}\".format(logs[\"val_loss\"] / logs[\"loss\"]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 11610 samples, validate on 3870 samples\n",
      "11168/11610===========================>..] - ETA: 0s - loss: 0.3464\n",
      "val/train: 0.98\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.3467 - val_loss: 0.3384\n"
     ]
    }
   ],
   "source": [
    "val_train_ratio_cb = PrintValTrainRatioCallback()\n",
    "history = model.fit(X_train, y_train, epochs=1,\n",
    "                    validation_data=(X_valid, y_valid),\n",
    "                    callbacks=[val_train_ratio_cb])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# TensorBoard"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [],
   "source": [
    "root_logdir = os.path.join(os.curdir, \"my_logs\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'./my_logs/run_2019_01_16-23_13_22'"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def get_run_logdir():\n",
    "    import time\n",
    "    run_id = time.strftime(\"run_%Y_%m_%d-%H_%M_%S\")\n",
    "    return os.path.join(root_logdir, run_id)\n",
    "\n",
    "run_logdir = get_run_logdir()\n",
    "run_logdir"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(42)\n",
    "tf.random.set_seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = keras.models.Sequential([\n",
    "    keras.layers.Dense(30, activation=\"relu\", input_shape=[8]),\n",
    "    keras.layers.Dense(30, activation=\"relu\"),\n",
    "    keras.layers.Dense(1)\n",
    "])    \n",
    "#model.compile(loss=\"mse\", optimizer=\"sgd\")\n",
    "# or try another learning rate:\n",
    "model.compile(loss=\"mse\", optimizer=keras.optimizers.SGD(lr=0.05))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 11610 samples, validate on 3870 samples\n",
      "Epoch 1/30\n",
      "11610/11610==============================] - 1s 79us/sample - loss: 0.5259 - val_loss: 0.4834\n",
      "Epoch 2/30\n",
      "11610/11610==============================] - 0s 34us/sample - loss: 0.4069 - val_loss: 0.3912\n",
      "Epoch 3/30\n",
      "11610/11610==============================] - 0s 36us/sample - loss: 0.3744 - val_loss: 7.5516\n",
      "Epoch 4/30\n",
      "11610/11610==============================] - 0s 38us/sample - loss: 0.3656 - val_loss: 1.1554\n",
      "Epoch 5/30\n",
      "11610/11610==============================] - 0s 38us/sample - loss: 0.3526 - val_loss: 0.4557\n",
      "Epoch 6/30\n",
      "11610/11610==============================] - 0s 37us/sample - loss: 0.3459 - val_loss: 0.3200\n",
      "Epoch 7/30\n",
      "11610/11610==============================] - 0s 36us/sample - loss: 0.3354 - val_loss: 0.3228\n",
      "Epoch 8/30\n",
      "11610/11610==============================] - 0s 38us/sample - loss: 0.3328 - val_loss: 0.3086\n",
      "Epoch 9/30\n",
      "11610/11610==============================] - 0s 37us/sample - loss: 0.3219 - val_loss: 0.3210\n",
      "Epoch 10/30\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.3210 - val_loss: 0.4311\n",
      "Epoch 11/30\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.3164 - val_loss: 0.3045\n",
      "Epoch 12/30\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.3132 - val_loss: 0.3113\n",
      "Epoch 13/30\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.3118 - val_loss: 0.3037\n",
      "Epoch 14/30\n",
      "11610/11610==============================] - 0s 36us/sample - loss: 0.3087 - val_loss: 0.3260\n",
      "Epoch 15/30\n",
      "11610/11610==============================] - 0s 40us/sample - loss: 0.3039 - val_loss: 0.2957\n",
      "Epoch 16/30\n",
      "11610/11610==============================] - 0s 38us/sample - loss: 0.3021 - val_loss: 0.2845\n",
      "Epoch 17/30\n",
      "11610/11610==============================] - 0s 38us/sample - loss: 0.3015 - val_loss: 0.3471\n",
      "Epoch 18/30\n",
      "11610/11610==============================] - 0s 38us/sample - loss: 0.3000 - val_loss: 0.2993\n",
      "Epoch 19/30\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.2953 - val_loss: 0.2841\n",
      "Epoch 20/30\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.2957 - val_loss: 0.3537\n",
      "Epoch 21/30\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.2952 - val_loss: 0.2773\n",
      "Epoch 22/30\n",
      "11610/11610==============================] - 0s 36us/sample - loss: 0.2939 - val_loss: 0.2755\n",
      "Epoch 23/30\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.2911 - val_loss: 0.2789\n",
      "Epoch 24/30\n",
      "11610/11610==============================] - 0s 34us/sample - loss: 0.2915 - val_loss: 0.2758\n",
      "Epoch 25/30\n",
      "11610/11610==============================] - 0s 34us/sample - loss: 0.2890 - val_loss: 0.3176\n",
      "Epoch 26/30\n",
      "11610/11610==============================] - 0s 34us/sample - loss: 0.2901 - val_loss: 0.2784\n",
      "Epoch 27/30\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.2858 - val_loss: 0.2988\n",
      "Epoch 28/30\n",
      "11610/11610==============================] - 0s 34us/sample - loss: 0.2895 - val_loss: 0.3054\n",
      "Epoch 29/30\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.2848 - val_loss: 0.3335\n",
      "Epoch 30/30\n",
      "11610/11610==============================] - 0s 34us/sample - loss: 0.2896 - val_loss: 2.8334\n"
     ]
    }
   ],
   "source": [
    "tensorboard_cb = keras.callbacks.TensorBoard(run_logdir)\n",
    "history = model.fit(X_train, y_train, epochs=30,\n",
    "                    validation_data=(X_valid, y_valid),\n",
    "                    callbacks=[checkpoint_cb, tensorboard_cb])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To start the TensorBoard server, one option is to open a terminal, if needed activate the virtualenv where you installed TensorBoard, then type:\n",
    "\n",
    "```bash\n",
    "$ tensorboard --logdir=./my_logs --port=6006\n",
    "```\n",
    "\n",
    "You can then open your web browser to [localhost:6006](http://localhost:6006) and use TensorBoard. Once you are done, press Ctrl-C in the terminal window, this will shutdown the TensorBoard server.\n",
    "\n",
    "Alternatively, you can create a Jupyter cell with this code:\n",
    "\n",
    "```bash\n",
    "%%bash\n",
    "tensorboard --logdir={run_logdir} --port=6006\n",
    "```\n",
    "\n",
    "When you run this cell, the TensorBoard server will start and you can use it at [localhost:6006](http://localhost:6006), but Jupyter will be blocked until you interrupt this cell, which will shutdown the server.\n",
    "\n",
    "Lastly, you can use the following `tb()` function that starts the TensorBoard server in a way that does not block Jupyter, and directly opens a new browser tab for you. It returns a handle on the server's process, so you can call `server.kill()` when you want to shutdown the server. Note that interrupting this notebook will shutdown all TensorBoard servers that you started this way.\n",
    "\n",
    "You may also want to install the jupyter-tensorboard extension which integrates nicely into Jupyter to start/stop TensorBoard servers."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [],
   "source": [
    "def tb(logdir=root_logdir, port=6006, open_tab=True, sleep=3):\n",
    "    import subprocess\n",
    "    proc = subprocess.Popen(\n",
    "        \"tensorboard --logdir={0} --port={1}\".format(logdir, port), shell=True)\n",
    "    if open_tab:\n",
    "        import time\n",
    "        print(\"Waiting a few seconds for the TensorBoard Server to start...\")\n",
    "        time.sleep(sleep)\n",
    "        import webbrowser\n",
    "        webbrowser.open(\"http://127.0.0.1:{}/\".format(port))\n",
    "    return proc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Waiting a few seconds for the TensorBoard Server to start...\n"
     ]
    }
   ],
   "source": [
    "server = tb()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'./my_logs/run_2019_01_16-23_13_38'"
      ]
     },
     "execution_count": 91,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "run_logdir2 = get_run_logdir()\n",
    "run_logdir2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(42)\n",
    "tf.random.set_seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = keras.models.Sequential([\n",
    "    keras.layers.Dense(30, activation=\"relu\", input_shape=[8]),\n",
    "    keras.layers.Dense(30, activation=\"relu\"),\n",
    "    keras.layers.Dense(1)\n",
    "])    \n",
    "model.compile(loss=\"mse\", optimizer=keras.optimizers.SGD(lr=0.015))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 11610 samples, validate on 3870 samples\n",
      "Epoch 1/10\n",
      "11610/11610==============================] - 1s 80us/sample - loss: 0.5997 - val_loss: 0.4971\n",
      "Epoch 2/10\n",
      "11610/11610==============================] - 0s 41us/sample - loss: 0.4173 - val_loss: 1.5356\n",
      "Epoch 3/10\n",
      "11610/11610==============================] - 0s 41us/sample - loss: 0.3927 - val_loss: 28.6786\n",
      "Epoch 4/10\n",
      "11610/11610==============================] - 0s 39us/sample - loss: 0.4054 - val_loss: 7.2650\n",
      "Epoch 5/10\n",
      "11610/11610==============================] - 0s 40us/sample - loss: 0.4046 - val_loss: 0.6207\n",
      "Epoch 6/10\n",
      "11610/11610==============================] - 0s 40us/sample - loss: 0.3645 - val_loss: 0.3646\n",
      "Epoch 7/10\n",
      "11610/11610==============================] - 0s 39us/sample - loss: 0.3516 - val_loss: 0.3539\n",
      "Epoch 8/10\n",
      "11610/11610==============================] - 0s 38us/sample - loss: 0.3480 - val_loss: 0.3315\n",
      "Epoch 9/10\n",
      "11610/11610==============================] - 0s 39us/sample - loss: 0.3464 - val_loss: 0.3483\n",
      "Epoch 10/10\n",
      "11610/11610==============================] - 0s 39us/sample - loss: 0.3394 - val_loss: 0.3602\n"
     ]
    }
   ],
   "source": [
    "tensorboard_cb = keras.callbacks.TensorBoard(run_logdir2)\n",
    "history = model.fit(X_train, y_train, epochs=10,\n",
    "                    validation_data=(X_valid, y_valid),\n",
    "                    callbacks=[checkpoint_cb, tensorboard_cb])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Notice how TensorBoard now sees two runs, and you can compare the learning curves."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on function __init__ in module tensorflow.python.keras.callbacks:\n",
      "\n",
      "__init__(self, log_dir='./logs', histogram_freq=0, batch_size=32, write_graph=True, write_grads=False, write_images=False, embeddings_freq=0, embeddings_layer_names=None, embeddings_metadata=None, embeddings_data=None, update_freq='epoch')\n",
      "    Initialize self.  See help(type(self)) for accurate signature.\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(keras.callbacks.TensorBoard.__init__)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [],
   "source": [
    "#server.kill() # uncomment and run this to stop the TensorBoard server"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Hyperparameter Tuning"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(42)\n",
    "tf.random.set_seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [],
   "source": [
    "def build_model(n_hidden=1, n_neurons=30, learning_rate=3e-3, input_shape=[8]):\n",
    "    model = keras.models.Sequential()\n",
    "    options = {\"input_shape\": input_shape}\n",
    "    for layer in range(n_hidden):\n",
    "        model.add(keras.layers.Dense(n_neurons, activation=\"relu\", **options))\n",
    "        options = {}\n",
    "    model.add(keras.layers.Dense(1, **options))\n",
    "    optimizer = keras.optimizers.SGD(learning_rate)\n",
    "    model.compile(loss=\"mse\", optimizer=optimizer)\n",
    "    return model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [],
   "source": [
    "keras_reg = keras.wrappers.scikit_learn.KerasRegressor(build_model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 11610 samples, validate on 3870 samples\n",
      "Epoch 1/100\n",
      "11610/11610==============================] - 1s 79us/sample - loss: 1.0910 - val_loss: 21.1892\n",
      "Epoch 2/100\n",
      "11610/11610==============================] - 0s 38us/sample - loss: 0.7607 - val_loss: 4.8909\n",
      "Epoch 3/100\n",
      "11610/11610==============================] - 0s 36us/sample - loss: 0.5401 - val_loss: 0.5721\n",
      "Epoch 4/100\n",
      "11610/11610==============================] - 0s 42us/sample - loss: 0.4752 - val_loss: 0.4433\n",
      "Epoch 5/100\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.4499 - val_loss: 0.4270\n",
      "Epoch 6/100\n",
      "11610/11610==============================] - 0s 37us/sample - loss: 0.4348 - val_loss: 0.4165\n",
      "Epoch 7/100\n",
      "11610/11610==============================] - 0s 41us/sample - loss: 0.4240 - val_loss: 0.4060\n",
      "Epoch 8/100\n",
      "11610/11610==============================] - 0s 36us/sample - loss: 0.4166 - val_loss: 0.4030\n",
      "Epoch 9/100\n",
      "11610/11610==============================] - 0s 36us/sample - loss: 0.4109 - val_loss: 0.4069\n",
      "Epoch 10/100\n",
      "11610/11610==============================] - 0s 37us/sample - loss: 0.4055 - val_loss: 0.4220\n",
      "Epoch 11/100\n",
      "11610/11610==============================] - 0s 36us/sample - loss: 0.4021 - val_loss: 0.4191\n",
      "Epoch 12/100\n",
      "11610/11610==============================] - 0s 39us/sample - loss: 0.3982 - val_loss: 0.3941\n",
      "Epoch 13/100\n",
      "11610/11610==============================] - 0s 36us/sample - loss: 0.3950 - val_loss: 0.4145\n",
      "Epoch 14/100\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.3923 - val_loss: 0.4155\n",
      "Epoch 15/100\n",
      "11610/11610==============================] - 0s 37us/sample - loss: 0.3897 - val_loss: 0.3774\n",
      "Epoch 16/100\n",
      "11610/11610==============================] - 0s 36us/sample - loss: 0.3873 - val_loss: 0.3828\n",
      "Epoch 17/100\n",
      "11610/11610==============================] - 0s 36us/sample - loss: 0.3847 - val_loss: 0.4104\n",
      "<<49 more lines>>\n",
      "11610/11610==============================] - 0s 38us/sample - loss: 0.3553 - val_loss: 0.3677\n",
      "Epoch 43/100\n",
      "11610/11610==============================] - 0s 36us/sample - loss: 0.3553 - val_loss: 0.3358\n",
      "Epoch 44/100\n",
      "11610/11610==============================] - 0s 36us/sample - loss: 0.3544 - val_loss: 0.3434\n",
      "Epoch 45/100\n",
      "11610/11610==============================] - 0s 37us/sample - loss: 0.3539 - val_loss: 0.4162\n",
      "Epoch 46/100\n",
      "11610/11610==============================] - 0s 42us/sample - loss: 0.3540 - val_loss: 0.3336\n",
      "Epoch 47/100\n",
      "11610/11610==============================] - 0s 38us/sample - loss: 0.3526 - val_loss: 0.3837\n",
      "Epoch 48/100\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.3526 - val_loss: 0.3353\n",
      "Epoch 49/100\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.3519 - val_loss: 0.3319\n",
      "Epoch 50/100\n",
      "11610/11610==============================] - 0s 36us/sample - loss: 0.3510 - val_loss: 0.3781\n",
      "Epoch 51/100\n",
      "11610/11610==============================] - 0s 35us/sample - loss: 0.3512 - val_loss: 0.3411\n",
      "Epoch 52/100\n",
      "11610/11610==============================] - 0s 36us/sample - loss: 0.3502 - val_loss: 0.4134\n",
      "Epoch 53/100\n",
      "11610/11610==============================] - 0s 36us/sample - loss: 0.3501 - val_loss: 0.3335\n",
      "Epoch 54/100\n",
      "11610/11610==============================] - 0s 36us/sample - loss: 0.3490 - val_loss: 0.3411\n",
      "Epoch 55/100\n",
      "11610/11610==============================] - 0s 36us/sample - loss: 0.3485 - val_loss: 0.3699\n",
      "Epoch 56/100\n",
      "11610/11610==============================] - 0s 39us/sample - loss: 0.3483 - val_loss: 0.3790\n",
      "Epoch 57/100\n",
      "11610/11610==============================] - 1s 44us/sample - loss: 0.3479 - val_loss: 0.4730\n",
      "Epoch 58/100\n",
      "11610/11610==============================] - 0s 43us/sample - loss: 0.3480 - val_loss: 0.4227\n",
      "Epoch 59/100\n",
      "11610/11610==============================] - 0s 40us/sample - loss: 0.3470 - val_loss: 0.6592\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<tensorflow.python.keras.callbacks.History at 0x13bbabda0>"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "keras_reg.fit(X_train, y_train, epochs=100,\n",
    "              validation_data=(X_valid, y_valid),\n",
    "              callbacks=[keras.callbacks.EarlyStopping(patience=10)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5160/5160==============================] - 0s 16us/sample - loss: 0.3504\n"
     ]
    }
   ],
   "source": [
    "mse_test = keras_reg.score(X_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_pred = keras_reg.predict(X_new)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(42)\n",
    "tf.random.set_seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 3 folds for each of 10 candidates, totalling 30 fits\n",
      "[CV] learning_rate=0.001683454924600351, n_hidden=0, n_neurons=15 ....\n",
      "Train on 7740 samples, validate on 3870 samples\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/100\n",
      "7740/7740==============================] - 1s 104us/sample - loss: 3.5539 - val_loss: 1.8522\n",
      "Epoch 2/100\n",
      "7740/7740==============================] - 0s 36us/sample - loss: 1.3322 - val_loss: 1.0094\n",
      "Epoch 3/100\n",
      "7740/7740==============================] - 0s 36us/sample - loss: 0.8593 - val_loss: 0.7356\n",
      "Epoch 4/100\n",
      "7740/7740==============================] - 0s 39us/sample - loss: 0.7338 - val_loss: 0.6880\n",
      "Epoch 5/100\n",
      "7740/7740==============================] - 0s 35us/sample - loss: 0.6915 - val_loss: 0.8475\n",
      "Epoch 6/100\n",
      "7740/7740==============================] - 0s 37us/sample - loss: 0.6710 - val_loss: 0.6480\n",
      "Epoch 7/100\n",
      "7740/7740==============================] - 0s 35us/sample - loss: 0.6507 - val_loss: 0.8315\n",
      "Epoch 8/100\n",
      "7740/7740==============================] - 0s 37us/sample - loss: 0.6384 - val_loss: 0.8030\n",
      "Epoch 9/100\n",
      "7740/7740==============================] - 0s 35us/sample - loss: 0.6268 - val_loss: 0.6048\n",
      "Epoch 10/100\n",
      "7740/7740==============================] - 0s 35us/sample - loss: 0.6152 - val_loss: 0.6129\n",
      "Epoch 11/100\n",
      "7740/7740==============================] - 0s 35us/sample - loss: 0.6038 - val_loss: 0.8304\n",
      "Epoch 12/100\n",
      "7740/7740==============================] - 0s 35us/sample - loss: 0.5992 - val_loss: 0.5584\n",
      "Epoch 13/100\n",
      "7740/7740==============================] - 0s 35us/sample - loss: 0.5896 - val_loss: 0.6129\n",
      "Epoch 14/100\n",
      "7740/7740==============================] - 0s 35us/sample - loss: 0.5826 - val_loss: 0.6516\n",
      "Epoch 15/100\n",
      "7740/7740==============================] - 0s 35us/sample - loss: 0.5775 - val_loss: 0.5914\n",
      "Epoch 16/100\n",
      "<<20 more lines>>\n",
      "11610/11610==============================] - 0s 42us/sample - loss: 0.3372 - val_loss: 0.3546\n",
      "Epoch 27/100\n",
      "11610/11610==============================] - 1s 43us/sample - loss: 0.3361 - val_loss: 0.3292\n",
      "Epoch 28/100\n",
      "11610/11610==============================] - 0s 41us/sample - loss: 0.3338 - val_loss: 0.3308\n",
      "Epoch 29/100\n",
      "11610/11610==============================] - 0s 42us/sample - loss: 0.3338 - val_loss: 0.3421\n",
      "Epoch 30/100\n",
      "11610/11610==============================] - 0s 42us/sample - loss: 0.3322 - val_loss: 0.3192\n",
      "Epoch 31/100\n",
      "11610/11610==============================] - 0s 41us/sample - loss: 0.3314 - val_loss: 0.3422\n",
      "Epoch 32/100\n",
      "11610/11610==============================] - 1s 43us/sample - loss: 0.3290 - val_loss: 0.3896\n",
      "Epoch 33/100\n",
      "11610/11610==============================] - 1s 43us/sample - loss: 0.3299 - val_loss: 0.3142\n",
      "Epoch 34/100\n",
      "11610/11610==============================] - 0s 42us/sample - loss: 0.3292 - val_loss: 0.3256\n",
      "Epoch 35/100\n",
      "11610/11610==============================] - 0s 42us/sample - loss: 0.3258 - val_loss: 0.3807\n",
      "Epoch 36/100\n",
      "11610/11610==============================] - 0s 42us/sample - loss: 0.3250 - val_loss: 0.3248\n",
      "Epoch 37/100\n",
      "11610/11610==============================] - 0s 42us/sample - loss: 0.3246 - val_loss: 0.3701\n",
      "Epoch 38/100\n",
      "11610/11610==============================] - 0s 41us/sample - loss: 0.3232 - val_loss: 0.3243\n",
      "Epoch 39/100\n",
      "11610/11610==============================] - 0s 42us/sample - loss: 0.3218 - val_loss: 0.3620\n",
      "Epoch 40/100\n",
      "11610/11610==============================] - 0s 42us/sample - loss: 0.3209 - val_loss: 0.3705\n",
      "Epoch 41/100\n",
      "11610/11610==============================] - 0s 42us/sample - loss: 0.3208 - val_loss: 0.3338\n",
      "Epoch 42/100\n",
      "11610/11610==============================] - 0s 42us/sample - loss: 0.3190 - val_loss: 0.4084\n",
      "Epoch 43/100\n",
      "11610/11610==============================] - 0s 43us/sample - loss: 0.3187 - val_loss: 0.3582\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "RandomizedSearchCV(cv=3, error_score='raise-deprecating',\n",
       "          estimator=<tensorflow.python.keras.wrappers.scikit_learn.KerasRegressor object at 0x152a86be0>,\n",
       "          fit_params=None, iid='warn', n_iter=10, n_jobs=None,\n",
       "          param_distributions={'n_hidden': [0, 1, 2, 3], 'n_neurons': array([ 1,  2, ..., 98, 99]), 'learning_rate': <scipy.stats._distn_infrastructure.rv_frozen object at 0x13bd002b0>},\n",
       "          pre_dispatch='2*n_jobs', random_state=None, refit=True,\n",
       "          return_train_score='warn', scoring=None, verbose=2)"
      ]
     },
     "execution_count": 104,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from scipy.stats import reciprocal\n",
    "from sklearn.model_selection import RandomizedSearchCV\n",
    "\n",
    "param_distribs = {\n",
    "    \"n_hidden\": [0, 1, 2, 3],\n",
    "    \"n_neurons\": np.arange(1, 100),\n",
    "    \"learning_rate\": reciprocal(3e-4, 3e-2),\n",
    "}\n",
    "\n",
    "rnd_search_cv = RandomizedSearchCV(keras_reg, param_distribs, n_iter=10, cv=3, verbose=2)\n",
    "rnd_search_cv.fit(X_train, y_train, epochs=100,\n",
    "                  validation_data=(X_valid, y_valid),\n",
    "                  callbacks=[keras.callbacks.EarlyStopping(patience=10)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'learning_rate': 0.0033625641252688094, 'n_hidden': 2, 'n_neurons': 42}"
      ]
     },
     "execution_count": 105,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rnd_search_cv.best_params_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-0.35500098818545706"
      ]
     },
     "execution_count": 106,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rnd_search_cv.best_score_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<tensorflow.python.keras.wrappers.scikit_learn.KerasRegressor at 0x13bab2ef0>"
      ]
     },
     "execution_count": 107,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rnd_search_cv.best_estimator_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5160/5160==============================] - 0s 19us/sample - loss: 0.3252\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "-0.3251738954422086"
      ]
     },
     "execution_count": 108,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rnd_search_cv.score(X_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<tensorflow.python.keras.engine.sequential.Sequential at 0x138a9af60>"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model = rnd_search_cv.best_estimator_.model\n",
    "model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5160/5160==============================] - 0s 22us/sample - loss: 0.3252\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.3251738954422086"
      ]
     },
     "execution_count": 110,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.evaluate(X_test, y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "# Exercise solutions"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. to 9."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "See appendix A."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 10."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "TODO"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  },
  "nav_menu": {
   "height": "264px",
   "width": "369px"
  },
  "toc": {
   "navigate_menu": true,
   "number_sections": true,
   "sideBar": true,
   "threshold": 6,
   "toc_cell": false,
   "toc_section_display": "block",
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
